2011-01-05 55 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