我正在學習WPF中的ICommands,並且遇到了一些簡單代碼的問題。我有一個帶命令的按鈕。如果我將命令參數設置爲像這樣的靜態值CommandParameter="100"
,則CanExecute中的參數parameter
的值爲100,但是當我通過綁定來設置命令參數的值,例如CommandParameter="{Binding}"
時,CanExecute中parameter
參數的值一片空白。當我將CommandParameter設置爲某個Binding時,爲什麼我的ICommand.CanExecute(object)參數爲空,但當我將它設置爲某個靜態值時,它是非null?
這裏是我的ICommand:
internal class MyCommand : ICommand
{
public bool CanExecute(object parameter) //parameter is null
{
var datacontext = parameter as MyDataContext;
if (datacontext == null)
return false;
return datacontext.IsChecked == true;
}
public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
throw new NotImplementedException();
}
}
這裏的XAML代碼。請注意,我在設置Command之前設置了CommandParameter。我得到了那個from here。同樣,如果我將CommandParameter更改爲CommandParameter="100"
之類的東西,則代碼的行爲與我預期的相同(即參數爲100,非空)。
<StackPanel Orientation="Vertical">
<StackPanel.Resources>
<cmd:MyCommand x:Key="kCmd" />
</StackPanel.Resources>
<CheckBox Content="Check this to enable button" IsChecked="{Binding IsChecked}" />
<Button Content="Click" CommandParameter="{Binding}"
Command="{StaticResource kCmd}" />
</StackPanel>
這是我的MainWindow代碼隱藏。在這裏,我在調用InitializeComponent()
之前設置DataContext。在調試時,我發現InitializeComponent()
觸發了對ICommand的CanExecute(object)
的調用。
public MainWindow()
{
this.DataContext = new MyDataContext();
InitializeComponent();
}
我的MyDataContext
類很簡單,所以我就把它排除了。
您是否嘗試在'InitializeComponent'後面設置'DataContext'? – dkozl 2014-09-29 14:34:32
@dkozl,我最初嘗試過。結果是一樣的。 – user2023861 2014-09-29 14:47:03
我最好的猜測是在DataContext設置之前調用CanExecute的時機。您是否可以在加載完所有內容後測試CanExecute,例如當您單擊Button時? – Rachel 2015-12-02 16:12:56