2013-03-01 28 views
3

我有一個UserControl與一些InputBindings。我想讓其中一個輸入綁定(箭頭鍵按下)在我的UserControl的GUI控件上執行一個命令。所以在XAML中,可以在聲明元素之前使用ElementName綁定?

例如

<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是在頂部,這可能使它忽略聲明順序?

+2

不,我不認爲你可以。你可以檢查:http://stackoverflow.com/questions/1301119/silverlight-xaml-attribute-definition-order-matters – mlemay 2013-03-01 19:45:21

+2

想想你的Xaml就像一個代碼塊,你不能在聲明它們之前使用變量。 – 2013-03-01 23:52:08

+0

@ sa_ddam213是的,我希望把它想像成一個班,在那裏我可以用它們無論在哪裏,他們都宣稱;-) – Alan 2013-03-02 06:38:10

回答

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應該永遠不會工作。那是不正確的。

+0

我給它第二次看在家裏 – Alan 2013-03-02 08:28:53

+0

我的測試代碼現在的工作,但我敢肯定,我收到一個錯誤之前...奇怪..我會檢查與週一相同的代碼,並得到回覆 – Alan 2013-03-02 10:21:16

+0

好的。涼。 :)))) – 2013-03-02 10:43:35

0

當然,您可以在XAML中做所有事情,包括窗口級別的綁定。顯示您的XAML/MyViewElement的更多代碼。也許我們可以告訴你如何做到沒有錯誤。請在此發佈您的錯誤。

0

但是,這樣做會失敗,因爲未找到MyViewElement,因爲我認爲它稍後在XAML中聲明。

爲了避免這種情況,你可以使用下面的代碼背後,而不是構造的

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

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

這可以確保你使用它們之前的命令已經實例:

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