3

我有一个带有一些 InputBindings 的 UserControl。我想让其中一个输入绑定(箭头键按下)在我的 UserControl 中的 GUI 控件上执行命令。所以

例如

<UserControl.InputBindings>
    <KeyBinding Key="Up" Command="{Binding ElementName=MyViewElement, Path=MoveUpCommand}"/>
    <KeyBinding Key="Down" Command="{Binding ElementName=MyViewElement, Path=MoveDownCommand}"/>
</UserControl.InputBindings>

但是,这失败了,因为未找到 MyViewElement,因为我假设它稍后在 XAML 中声明。如果我将 InputBindings 移动到 XAML 文件的末尾,一切都会按预期工作。

我有点喜欢我的 InputBindings 在顶部,是否可以让它忽略声明顺序?

4

3 回答 3

1

@Stewbob 你在说什么?

看看这个:http: //msdn.microsoft.com/en-us/library/ms752308.aspx

<Window.CommandBindings>
  <CommandBinding Command="ApplicationCommands.Open"
                  Executed="OpenCmdExecuted"
                  CanExecute="OpenCmdCanExecute"/>
</Window.CommandBindings>

根据您所说,这永远不会正常工作,但确实可以:

<StackPanel>
  <Menu>
    <MenuItem Command="ApplicationCommands.Paste"
              CommandTarget="{Binding ElementName=mainTextBox}" />
  </Menu>
  <TextBox Name="mainTextBox"/>
</StackPanel>

从您所说的绑定开始,它也将首先执行,因此与 mainTextBox 的绑定永远不会起作用。那是非常不正确的。

于 2013-03-02T07:21:20.977 回答
0

当然,您可以在 XAML 中执行所有操作,包括在窗口级别进行此类绑定。显示您的 XAML/MyViewElement 的更多代码。也许我们可以告诉你如何做到这一点而不会出错。也请在这里发布您的错误。

于 2013-03-01T21:12:30.177 回答
0

但是,这失败了,因为未找到 MyViewElement,因为我假设它稍后在 XAML 中声明。

为避免这种情况,您可以在后面的代码中使用以下代码而不是构造函数:

protected override void OnInitialized(EventArgs e)
{
    SomeCommand = new DelegateCommand(SomeExecuteMethod);

    InitializeComponent();
    base.OnInitialized(e);
}

这可确保命令在您使用它们之前已经实例化:

Command="{Binding ElementName=MyUserCOntrol, Path=SomeCommand}"
于 2017-11-23T10:29:25.657 回答