2016-04-26 171 views
0

我看到了这个SO question但是当我尝试它不起作用。WPF命令绑定破坏

我知道我可以做mvvm,但执行命令做的是查看特定的,所以我希望它在视图上完成。

<Grid> 
     <TextBox> 
      <TextBox.ContextMenu> 
       <ContextMenu> 
        <MenuItem Header="_Copy" CommandTarget="{Binding Path=PlacementTarget, 
      RelativeSource={RelativeSource FindAncestor, 
      AncestorType={x:Type ContextMenu}}}"> 
         <MenuItem.CommandBindings> 
          <CommandBinding CanExecute="CommandBinding_CanExecute" 
               Executed="CommandBinding_Executed" 
               /> 
         </MenuItem.CommandBindings> 
        </MenuItem> 
       </ContextMenu> 
      </TextBox.ContextMenu> 
     </TextBox> 
    </Grid> 

后面的代码:

private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e) 
     { 
      e.CanExecute = false; 
     } 

我期待的菜单被禁用,但它不是:

enter image description here

我尝试过其他方法:

<!--Approach 2: CopyCommand as property of the Window. CopyCommand is in code-behind of the window--> 
<MenuItem Header="_Copy" Command="{Binding Path=CopyCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/> 

<!--Approach 3: Saw other samples on the net about binding to PlacementTarget. CopyCommand is in code-behind of the window--> 
<MenuItem Header="_Copy" Command="{Binding Path=PlacementTarget.CopyCommand, RelativeSource={RelativeSource AncestorType=ContextMenu}}"/> 
+0

这里是哪里你的命令? – AnjumSKhan

+0

@AnjumSKhan MenuItem.CommandBindings。请参阅

+0

另见:http://stackoverflow.com/questions/36855188/wpf-command-binding-broken和http://stackoverflow.com/questions/4096186 /为什么它不好暴露模型通过viewmodel在Silverlight -mvvm/4154225#4154225 –

回答

0

我有我的观点的代码CopyCommand后面。

查看:

public ICommand CopyCommand { get { return _copyCommand; } } 

然后我能够访问它时,我把视图的实例在文本框的标签属性作为指定here

<views:myView> 

<Grid> 
<TextBox Tag="{Binding RelativeSource={RelativeSource AncestorType={x:Type views:myView}}}"> 
      <TextBox.ContextMenu> 
       <ContextMenu DataContext="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}"> 
         <MenuItem Header="_Copy" Command="{Binding CopyCommand}"/> 
        </ContextMenu> 
      </TextBox.ContextMenu> 
     </TextBox> 
</views:myView> 

</Grid> 
-1

MenuItem指定Command这样的:

<MenuItem Command="ApplicationCommands.Copy" .../> 

另外在CommandBinding指定Command属性的值,

<MenuItem.CommandBindings> 
    <CommandBinding Command="ApplicationCommands.Copy" CanExecute="CommandBinding_CanExecute" 
        Executed="CommandBinding_Executed" /> 
</MenuItem.CommandBindings> 
+0

我试过但它没有工作我看着Snoop,它包含命令属性,但事件以及命令没有被调用。 m在这个问题上很疯狂。 –

+0

@JanNavarro Plz看到我更新的答案。 – AnjumSKhan

0

如果你想实现WPF内置ApplicationCommands.Copy财产所有你需要做的是

<TextBox> 
    <TextBox.ContextMenu> 
     <ContextMenu> 
       <MenuItem Command="ApplicationCommands.Copy"/> 
     </ContextMenu> 
    </TextBox.ContextMenu> 
</TextBox> 

由于命令与文本框相关联,它将au主动处理执行并可以执行事件。

但是,如果你想实现自己的自定义命令你必须要有点冗长

public static class MyCommands 
{ 
    public static readonly RoutedUICommand Copy= new RoutedUICommand 
      (
        "Copy", 
        "_Copy", 
        typeof(MyCommands), 
        null 
      ); 

    //You can define more commands here 
} 

private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e) 
{ 
     e.CanExecute = true; //can check with debugger... 
} 

private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e) 
{ 
    //Your Action 
} 

在XAML

<Window.CommandBindings> 
    <CommandBinding Command="local:MyCommands.Copy" CanExecute="CommandBinding_CanExecute" Executed="CommandBinding_Executed" /> 
</Window.CommandBindings> 
<Grid> 

    <TextBox> 
     <TextBox.ContextMenu> 
      <ContextMenu> 
       <MenuItem Command="local:MyCommands.Copy"/> 
      </ContextMenu> 
     </TextBox.ContextMenu> 
    </TextBox> 
</Grid>