[英]Button not enabled even after providing CommandParameter in WPF
我創建了一個按鈕,其命令參數設置和命令使用實現ICommand接口的類。 但是我的按鈕被禁用了。 這是為什么? 我從這里得到了這個代碼: ICommand就像一塊巧克力蛋糕
<Window x:Class="ICommand_Implementation_CSharp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ICommand_Implementation_CSharp"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid>
<Grid.Resources>
<local:HelloWorldCommand x:Key="hwc" />
</Grid.Resources>
<Button Command="{StaticResource hwc}" CommandParameter="Hello"
Height="23" HorizontalAlignment="Left" Margin="212,138,0,0"
Name="Button1" VerticalAlignment="Top" Width="75">Button</Button>
</Grid>
</Grid>
我的班級是
class HelloWorldCommand:ICommand
{
public bool CanExecute(object parameter)
{
return parameter != null;
}
public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
MessageBox.Show(parameter.ToString());
}
}
最簡單的答案 - 切換Command和Command參數的位置:
<Button CommandParameter="Hello" Command="{StaticResource hwc}" .../>
但是@Dennis給出了更好的一個
嗯,這是非常非常簡單的ICommand
實現。
正如@JleruOHeP所說,部分問題可以通過交換Command
和CommandParameter
setter來解決。 但這很丑陋,因為你每次都要記住這個序列。
更正確的方法是告訴CommandManager
重新查詢命令狀態:
public class HelloWorldCommand : ICommand
{
public bool CanExecute(object parameter)
{
return parameter != null;
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public void Execute(object parameter)
{
MessageBox.Show(parameter.ToString());
}
}
現在,制定者的順序是無關緊要的。
要了解CommandManager
工作原理,您可以閱讀Josh Smith撰寫的這篇精彩文章。
在我的情況下,導致問題的是CommandParameter
類型。 我的按鈕就像這樣綁定:
<Button Content="New" Command="{Binding NewCommand}" CommandParameter="False" />
底層的NewCommand
是一個RelayCommand<bool>
。 不知何故,XAML無法將False
轉換為bool。 (請注意,它適用於許多內置類型和屬性;可能有一些TypeConverter
或其他操作)。
解決方案是簡單地為XAML提供有關CommandParameter
真正基礎類型的提示,如下所示:
<Button Content="New" Command="{Binding NewCommand}">
<Button.CommandParameter>
<sys:Boolean>
False
</sys:Boolean>
</Button.CommandParameter>
</Button>
您必須在XAML文件的頂部導入sys
命名空間,如下所示:
xmlns:sys="clr-namespace:System;assembly=mscorlib"
希望這有助於有人在路上。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.