我正在动态填充上下文菜单,使用这样的类来表示每个项目: -
public class ContextMenuItem : INotifyPropertyChanged
{
public string Header {get;set;}
public bool IsChecked {get;set;}
public ICommand Command {get;set;}
..etc..
}
请注意,这些属性实现了标准的INotifyPropertyChanged内容,我在这里省略了这些内容。
我不会包含XAML - 以上属性只是绑定到他们的MenuItem
对应物。
这是我的问题。我想要一个菜单项的IsChecked
状态来“跟踪”另一个模型的布尔属性的值。 E.g: -
var menuItem = new ContextMenuItem
{
Caption = "Online?",
IsChecked = user.IsOnline
};
这显然无法正常工作 - 虽然菜单项的检查状态 最初将反映用户的在线状态,但检查状态不会随user.IsOnline
更改而改变。
一种方法是订阅user
对象的PropertyChanged事件,并在IsChecked
更改时更改IsOnline
,但这有点令人费解。有更优雅的解决方案吗?
答案 0 :(得分:0)
如果你使IsChecked
成为dependancy property并且你的类是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);
答案 1 :(得分:0)
如果您的用户对象也实现了INotifyPropertyChanged,您可以在VM中公开User并直接绑定到它。
<... IsCheck="{Binding User.IsOnline}" ... >
但是你订阅用户PropertyChanged的方法也运行良好:)有一些辅助类可以减少锅炉代码