簡體   English   中英

即使在WPF中提供CommandParameter后,按鈕仍未啟用

[英]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所說,部分問題可以通過交換CommandCommandParameter 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM