在XAML中,是否可以在声明引用的元素之前使用ElementName绑定?

时间:2013-03-01 19:36:35

标签: wpf

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

e.g。

<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位于顶部,是否可以忽略声明顺序?

3 个答案:

答案 0 :(得分: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的绑定永远不会起作用。那不是真的。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

  

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

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

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

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

这可以确保在使用命令之前已经实例化了命令:

Command="{Binding ElementName=MyUserCOntrol, Path=SomeCommand}"