settingsflyout中的Combobox在再次打开时不会显示选定的值

时间:2014-07-19 09:22:27

标签: combobox windows-store-apps winrt-xaml windows-8.1 flyout

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

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

方案: 在Settingsflyout中使用Combobox。

<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>

ViewModelCode:

    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"); }
    }

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"); }
    }

1 个答案:

答案 0 :(得分:1)

我尝试了一段代码,无法重现该问题。你能提供更多代码吗?还有其他设置所选项目的东西吗?

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

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

这样的东西
    private UserAccount _selectedUserAccount { get; set; }

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

编辑:

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

    private void ComboBox_Loaded(object sender, RoutedEventArgs e)
    {
        ComboBox comboBox = sender as ComboBox;
        comboBox.SelectedItem =
            _viewModel.UserAccounts.Where(x => x.UserAccountString ==  _viewModel.SelectedUserAccount.UserAccountString);
    }