WPF绑定 - 避免间接级别

时间:2013-04-15 10:15:46

标签: wpf binding

我正在动态填充上下文菜单,使用这样的类来表示每个项目: -

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,但这有点令人费解。有更优雅的解决方案吗?

2 个答案:

答案 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的方法也运行良好:)有一些辅助类可以减少锅炉代码