2011-01-05 54 views
1

我有一個WPF按鈕,當前有兩個函數我想要放入MVVM模式。如果單擊時滿足條件,它將打開我們動態構建的上下文菜單,否則我們只需執行另一個函數。將按鈕點擊事件的WPF上下文菜單更改爲MVVM

private void Button_MouseDown(object sender, MouseButtonEventArgs e) 
{ 
    if (e.ChangedButton == MouseButton.Left) 
    { 
     if (MyTest()) 
     { 
      Button b = sender as Button; 
      ContextMenu contextMenu = MyContextMenuBuilder(); 
      contextMenu.PlacementTarget = b; 
      contextMenu.Placement = System.Windows.Controls.Primitives.PlacementMode.Bottom; 
      contextMenu.IsOpen = true; 
     } 
     else 
     { 
      MyOtherFunction(); 
     } 
    } 
} 

我該如何MV-VM這個代碼,因爲VM不知道放置菜單的按鈕和菜單本身是否打開它?

回答

0

您可以將MyTest()放入您放置在按鈕的DataContext中的對象中,然後在XAML中定義一個DataTrigger來決定啓用了哪些內容。 EG:

public class ButtonAnnotation 
{ 
    public object Foo { get; set; } 

    public bool SatisfiesTest { 
     get { 
      ... logic for MyTest goes here ... 
     } 
    } 

} 

... 
this.TheButtonOrItsParent.DataContext = new ButtonAnnotation(); 

然後在XAML:

<DataTrigger Binding="{Binding Path=SatisfiesTest}" Value="True"> 
    <DataTrigger.Setters> 
     <Setter Property="ContextMenu" Value="{StaticResource TheContextMenu}"/> 
    </DataTrigger.Setters> 
</DataTrigger> 
+0

其中'INotifyPropertyChanged'在'ButtonAnnotation'? – Svisstack 2011-01-19 22:28:57