【发布时间】:2012-11-19 19:07:32
【问题描述】:
以下是两个 xaml sn-ps,唯一的区别是一个示例直接填充窗口的可视化树和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 加载错误日志条目。当我从第二个 sn-p 中删除命令绑定时,设计器错误消失了,应用程序在本地和其他 PC 上执行都没有问题。
请有人向我解释异常的原因以及如何在模板中指定命令绑定。
【问题讨论】:
-
你必须解释“我将 DataContext 从上一个 sn-p 直接移动到窗口的内容中,并将模板的其余部分移动到 DataTemplate 中”
-
那应该是
[...] move the window contents into a DataTemplate and move the DataContext into the window contents。这可能仍然令人困惑,因此我重新构造了问题以更好地说明这两种情况。
标签: c# .net wpf routed-commands