0

これはとても簡単に思えましたが、私にとっては悪夢に変わりました。すべてがうまく機能し、値を選択でき、ビューモデルに報告されます。

問題: ユーザーが設定フライアウトを開いて値を選択します。ユーザーがフライアウトを終了します。ユーザーが設定フライアウトを再度開くと、コンボボックスに選択された値がありません。ただし、値はビューモデルに存在します。

シナリオ: 設定フライアウトのコンボボックス。

<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 のアイテムのタイプは、選択したアイテムのアイテムのタイプとは異なります。選択したアイテム バインディングを、アイテム ソース内の同じクラスに変更してみます。

たとえば、ビューモデル プロパティ 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 に答える