0

各項目を表すためにこのようなクラスを使用して、コンテキストメニューを動的に設定しています:-

public class ContextMenuItem : INotifyPropertyChanged
{
    public string Header {get;set;}
    public bool IsChecked {get;set;}
    public ICommand Command {get;set;}
    ..etc..
}

プロパティが標準の INotifyPropertyChanged を実装していることに注意してください。これは、スペースを節約するためにここでは省略しています。

XAML は含めません。上記のプロパティはMenuItem対応するプロパティにバインドされているだけです。

これが私の問題です。IsCheckedメニュー項目の状態で、別のモデルのブール値プロパティの値を「追跡」したいと考えています。例えば:-

var menuItem = new ContextMenuItem
    {
       Caption = "Online?", 
       IsChecked = user.IsOnline
    };

これは明らかに適切に機能しません。メニュー項目のチェック済みの状態最初はユーザーのオンライン状態を反映しますが、変更してもチェック済みの状態は変わりませんuser.IsOnline

1 つのアプローチは、userオブジェクトの PropertyChanged イベントをサブスクライブし、変更さIsCheckedれるたびにIsOnline変更することですが、これは少し複雑に感じます。よりエレガントなソリューションはありますか?

4

2 に答える 2

0

ユーザー オブジェクトも INotifyPropertyChanged を実装している場合は、VM で User を公開し、VM に直接バインドできます。

 <... IsCheck="{Binding User.IsOnline}" ... >

しかし、ユーザーPropertyChangedをサブスクライブするアプローチもうまく機能します:)ボイラーコードを削減するヘルパークラスがいくつかあります

于 2013-04-15T10:36:24.610 に答える
0

依存関係プロパティとクラスを DependencyObject にするとIsChecked、次のようにそれらをバインドできます

 public class ContextMenuItem : DependencyObject
 {
     public static readonly DependencyProperty IsCheckedProperty = 
          DependencyProperty.Register("IsChecked", typeof(bool), typeof(ContextMenuItem ));


    public bool IsChecked
    {
        get
        {
            return this.GetValue(IsCheckedProperty) as string;
        }
        set
        {
            this.SetValue(IsCheckedProperty, value);
        }
    }
 }

 var binding = new Binding("IsOnline");
 binding.Source = user;
 binding.Mode = BindingMode.OneWay;
 BindingOperations.SetBinding(menuItem,ContextMenuItem.IsCheckedProperty,binding);
于 2013-04-15T10:28:20.110 に答える