2013-04-15 87 views
0

我填充上下文菜單動態,使用這樣的類來表示每個項目的水平: -WPF綁定 - 避免間接

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事件,並在IsOnline更改時更改IsChecked,但這感覺有些複雜。有沒有更優雅的解決方案?

回答

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); 
+0

作品一種享受 - 非常感謝! –

0

如果您的用戶對象也執行INotifyPropertyChanged,你可以在你的虛擬機暴露用戶和直接綁定到它。

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

,但你的方式來訂閱用戶的PropertyChanged工作很順利:)還有一些輔助類各地至極減少鍋爐碼