以下是两个 xaml 片段,其中唯一的区别是一个示例直接填充窗口的可视化树,DataContext
而另一个示例通过应用数据模板构造相同的窗口。
可视化树内容/DataContext
<Window>
<Window.DataContext>
<local:MyType />
</Window.DataContext>
<DockPanel>
<DockPanel.CommandBindings>
<CommandBinding Command="ApplicationCommands.New"
CanExecute="OnCanExecuteNew"
Executed="OnExecuteNew"
/>
</DockPanel.CommandBindings>
<ToolBarTray DockPanel.Dock="Top">
<ToolBar>
<Button Command="ApplicationCommands.New"
Content="New"
/>
</ToolBar>
</ToolBarTray>
<ContentPresenter Content="{Binding SomeProperty}" />
</DockPanel>
</Window>
业务对象内容和数据模板
<Window>
<Window.Resources>
<DataTemplate DataType="{x:Type local:MyType}">
<DockPanel>
<DockPanel.CommandBindings>
<CommandBinding Command="ApplicationCommands.New"
CanExecute="OnCanExecuteNew"
Executed="OnExecuteNew"
/>
</DockPanel.CommandBindings>
<ToolBarTray DockPanel.Dock="Top">
<ToolBar>
<Button Command="ApplicationCommands.New"
Content="New"
/>
</ToolBar>
</ToolBarTray>
<ContentPresenter Content="{Binding SomeProperty}" />
</DockPanel>
</DataTemplate>
</Window.Resources>
<Window.Content>
<local:MyType />
</Window.Content>
</Window>
第一个示例(可视树内容和数据上下文)按预期工作,而设计者在第二个示例中引发编译时错误:“无法绑定到目标方法,因为它的签名或安全透明度与委托类型。 ”尽管出现设计器错误,我仍然可以在本地运行应用程序,我已验证路由命令处理程序正在执行。当尝试在其他 PC 上运行应用程序时,应用程序在启动时静默失败,在 Windows 事件日志中留下 xaml 加载错误日志条目。当我从第二个片段中删除命令绑定时,设计器错误消失了,应用程序在本地和其他 PC 上执行都没有问题。
有人可以向我解释异常的原因以及如何在模板中指定命令绑定。