首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在数据板中设置CommandBinding

无法在数据板中设置CommandBinding
EN

Stack Overflow用户
提问于 2012-11-19 19:07:32
回答 1查看 1.7K关注 0票数 2

下面是两个xaml片段,其中唯一的区别是,一个示例直接填充窗口的可视树和DataContext,而另一个示例通过应用数据模板构造相同的窗口。

视觉树内容/ DataContext

代码语言:javascript
复制
<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>

业务对象内容& DataTemplate

代码语言:javascript
复制
<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上执行时都没有问题。

请有人向我解释异常的原因,以及如何在模板中指定命令绑定。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-21 14:35:00

我可以在designer (VS2010 SP1目标框架.NET4.0) System.Windows.Markup.XamlParseException: Failed to create a 'CanExecute' from the text 'OnCanExecuteNew'中使用以下错误来再现它

System.ArgumentException: Error binding to target method.

但是我可以构建这个应用程序,它可以在我的本地机器上工作。

我认为设计人员在这里的工作方式与WPF运行时不同。当在设计时应用模板并解析CommandBinding的事件处理程序时,模板的结果可视化树仍然不是窗口可视化树的一部分。这就是为什么处理程序不能被解析的原因。作为一种解决办法,我会考虑以下选项。

1)将CommandBindings放入窗口

代码语言:javascript
复制
<Window.CommandBindings>
    <CommandBinding Command="ApplicationCommands.New"
                    CanExecute="OnCanExecuteNew"
                    Executed="OnExecuteNew"/>
</Window.CommandBindings>

2)在UserControl中封装数据模板的内容,并将事件处理程序放置在它的代码后面。

UserControl.xaml

代码语言:javascript
复制
<UserControl x:Class="WpfApplication1.UserControl1">
    <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>
</UserControl>

Window.xaml

代码语言:javascript
复制
<DataTemplate DataType="{x:Type local:MyType}">
    <local:UserControl1/>
</DataTemplate>

3)根本不要使用CommandBindings,并将命令对象放到视图模型(视图模型)中。

代码语言:javascript
复制
<Button Command="{Binding NewCommand}" Content="New"/>

作为一般规则,我建议避免数据模板和后面代码的紧密耦合。数据模板应该是您获取并放入资源字典中的内容。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13460421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档