Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF CommandBinding不在顶级项/窗口/此_Wpf_Icommand_Commandbinding - Fatal编程技术网

WPF CommandBinding不在顶级项/窗口/此

WPF CommandBinding不在顶级项/窗口/此,wpf,icommand,commandbinding,Wpf,Icommand,Commandbinding,我想要的只是不同选项卡上的不同绑定,所以切换选项卡将切换命令可用性。我以为命令绑定就是这样的 但我花了最后一段时间来尝试让这个简单的示例工作。要么我根本误解了(这不是第一次),要么出了什么问题 我将CommandBinding添加到textBoxA,但不添加到textBoxB。在它们之间移动应启用和禁用设置为相应命令的按钮 将CommandBinding添加到窗口中可以很好地启用按钮,但这样做会破坏特定于项的CommandBinding的整体功能 使用这个XAML <Window x:Cl

我想要的只是不同选项卡上的不同绑定,所以切换选项卡将切换命令可用性。我以为命令绑定就是这样的

但我花了最后一段时间来尝试让这个简单的示例工作。要么我根本误解了(这不是第一次),要么出了什么问题

我将CommandBinding添加到textBoxA,但不添加到textBoxB。在它们之间移动应启用和禁用设置为相应命令的按钮

将CommandBinding添加到窗口中可以很好地启用按钮,但这样做会破坏特定于项的CommandBinding的整体功能

使用这个XAML

<Window x:Class="WpfApplication2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="500">
    <Canvas>
        <Button Canvas.Left="31" Canvas.Top="24" Content="Click Me" Name="button1" Width="100"/>
        <TextBox Canvas.Left="155" Canvas.Top="22" Height="23" Name="textBoxA" Width="120" Text="A" />
        <TextBox Canvas.Left="298" Canvas.Top="22" Height="23" Name="textBoxB" Width="120" Text="B" />
    </Canvas>
</Window>
您将看到(如果您尝试此代码),即使您从一个文本框移动到另一个文本框,该按钮仍然处于禁用状态。(即使textBoxA应该启用按钮,因为它实现了按钮的CommandBinding)

这是怎么回事


提前谢谢。

我看不出这是怎么回事,而且您似乎没有抓住要点(对不起)-CommandBinding应该应用于父元素(将其放在画布上也可以)。单击按钮后,RoutedCommand将在可视化树中“冒泡”,这意味着任何父元素都将触发其绑定到此命令的事件。该按钮保持禁用状态的原因是,您无法在该点执行open命令,并且CommandBinding未被计算,因为它不在执行路径中。请看这里:


我将试着看看是否能达到您的情景:

<Canvas>
    <Button ... Command="Open">
        <CommandBindings>
            <CommandBinding Command="Open" Executed="OnOpen"/>
        <CommandBindings>
    </Button>
    <TextBox ... >
        <CommandBindings>
            <CommandBinding Command="Open" Executed="OnOpen"/>
        <CommandBindings>
    </TextBox>
    <TextBox ... />
</Canvas>
CommandBindings的思想是成为一条捷径,让常用的按键在上下文中的按钮和其他控件(通常是usercontrol)之间工作。然后,每个区域对Open命令都有不同的含义(一个区域可能会打开一个文件,另一个区域可能会打开ListView中选定的项目,依此类推)


在我的示例中,当文本框A或按钮有焦点时按CTRL+O将触发“Hello”消息框。但是请阅读Leom链接到的页面以获得更深入的解释。

MSFT在他们的WPF论坛中给了我正确的答案,这里

如果你看这里(),它显示WPF有文本框(可能还有其他控件)的默认绑定。我还知道,文本框默认为“复制/粘贴”(例如)。不仅仅是在类似父控件(如画布)上。例如,如果文本框不能执行我的建议,为什么它会有CommandBindings集合属性。(顺便说一句,感谢您的回复)另外,设置为画布(如果有两个)与我的示例有相同的问题。据我所知,CommandBinding的目的是允许树上较高的元素在对较低的元素触发命令时侦听和执行。文本框具有CommandBindings属性,因为它们是一个UIElement,您可以在文本框中放置一个按钮,而不会出现任何问题,然后它将拾取按钮命令事件。谢谢。所以,我接下来的问题是,我想使用Open命令,但是当我在TextBoxA中时,我想要一个CommandBinding(比如,OnOpen1()),当我在TextBoxB中时,我想要一个不同的CommandBinding(比如,OnOpen2())。而且,为了更好的衡量,如果我在TextBoxC中,我希望禁用该按钮。像您这样的直接实现可以很好地工作。我意识到了这一点。然后您只需交换所讨论的CommandBinding的Execute部分。因此,一个eventhandler用于TextBoxA,另一个用于TextBoxB。但是,您应该删除按钮的commandbinding-然后它应该全部工作,因为它将响应VisualTree中从逻辑焦点“最近”的commandbinding-(如果您在TextBoxA中,则为TextBoxA的commandbinding,如果您在TextBoxB中,则为TextBoxB的commandbinding,依此类推)。我再次尝试问这个问题:
<Canvas>
    <Button ... Command="Open">
        <CommandBindings>
            <CommandBinding Command="Open" Executed="OnOpen"/>
        <CommandBindings>
    </Button>
    <TextBox ... >
        <CommandBindings>
            <CommandBinding Command="Open" Executed="OnOpen"/>
        <CommandBindings>
    </TextBox>
    <TextBox ... />
</Canvas>
private void OnOpen(object sender, ExecutedRoutedEventArgs e)
{
    MessageBox.Show("Hello");
}