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改变。

一种方法是订阅user对象的 PropertyChanged 事件,并在更改IsCheckedIsOnline更改,但这感觉有点复杂。有没有更优雅的解决方案?

4

2 回答 2

0

如果您的用户对象也实现了 INotifyPropertyChanged,您可以在 VM 中公开 User 并直接绑定到它。

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

但是您订阅用户 PropertyChanged 的​​方法也很有效:) 周围有一些帮助程序类可以减少锅炉代码

于 2013-04-15T10:36:24.610 回答
0

如果您创建IsChecked一个依赖属性并且您的类是一个 DependencyObject,您可以像这样将它们绑定在一起

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