0

这看起来很简单,但对我来说却变成了一场噩梦。一切都很好,我可以选择一个值并将其报告回视图模型。

问题: 用户打开设置弹出窗口并选择一个值。用户退出浮出控件。用户重新打开设置浮出控件,组合框中没有选定值。但是,该值存在于视图模型中。

场景:Settingsflyout 中的组合框。

<ComboBox x:Name="defaultComboBox" SelectedItem="{Binding UserSettings.DefaultAccount, Mode=TwoWay}"  ItemsSource="{Binding UserAccounts}" DisplayMemberPath="CustomName">

<interactivity:Interaction.Behaviors>
            <core:EventTriggerBehavior EventName="Loaded">
                <core:InvokeCommandAction Command="{Binding UserAccountComboboxLoadedCommand}" CommandParameter="{Binding ElementName=defaultAccountComboBox}"/>
            </core:EventTriggerBehavior>
            </interactivity:Interaction.Behaviors>
</ComboBox>

视图模型代码:

    public void Open(object parameter, Action successAction)
    {
        logger.LogProgress("Opened UserSettingsFlyoutView.");
        UserSettings.DefaultAccount =  UserAccounts.FirstOrDefault(u => u.AccountID.ToString().Equals(userSettings.DefaultAccountGuid,StringComparison.CurrentCultureIgnoreCase));
    }

    public CrossThreadObservableCollection<UserAccount> UserAccounts
    {
        get
        {
            try
            {
                return dbContext.RetrieveAllUserAccounts();
            }
            catch(Exception e)
            {
                logger.LogError("Error happened when retrieving user-accounts from secure data store Error: " + e.Message, e.ToString());
                return new CrossThreadObservableCollection<UserAccount>();
            }
        }
    } 

    private IProvideUserSetting userSettings;

    public IProvideUserSetting UserSettings
    {
        get { return userSettings; }
        set { userSettings = value; OnPropertyChanged("UserSettings"); }
    }

用户设置类:

 private string defaultAccountGuid;
    [DataMember]
    public string DefaultAccountGuid
    {
        get { return defaultAccountGuid; }
        set { defaultAccountGuid = value; OnPropertyChanged("DefaultAccountGuid"); }
    }

    private UserAccount defaultAccount;
    [IgnoreDataMember]
    public UserAccount DefaultAccount
    {
        get { return defaultAccount; }
        set { 
            defaultAccount = value;
            if (defaultAccount != null)
                DefaultAccountGuid = defaultAccount.AccountID.ToString();
            OnPropertyChanged("DefaultAccount"); }
    }
4

1 回答 1

1

我尝试了代码的一个版本,但无法重现该问题。你能提供更多代码吗?是否还有其他设置所选项目?

无论如何,ItemsSource 中的项目类型与所选项目的项目类型不同。我会尝试将所选项目绑定更改为项目源中的同一类。

例如,代替 viewmodel 属性 UserSettings,使该对象类型为 UserAccount。

就像是

    private UserAccount _selectedUserAccount { get; set; }

    public UserAccount SelectedUserAccount
    {
        get { return _selectedUserAccount; }
        set
        {
            if (_selectedUserAccount != value)
            {
                _selectedUserAccount = value;
                OnPropertyChanged("SelectedUserAccount");
            }
        }
    }

编辑:

您可以将加载的事件处理程序添加到您的组合框,然后从后面的代码中找到视图模型并设置选定的项目属性。

    private void ComboBox_Loaded(object sender, RoutedEventArgs e)
    {
        ComboBox comboBox = sender as ComboBox;
        comboBox.SelectedItem =
            _viewModel.UserAccounts.Where(x => x.UserAccountString ==  _viewModel.SelectedUserAccount.UserAccountString);
    }
于 2014-07-22T02:18:13.077 回答