我有一个带有一些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位于顶部,是否可以忽略声明顺序?
答案 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}"