5

コマンドパラメータが設定されているボタンと、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());
    }
}
4

3 に答える 3

7

まあ、これは非常に単純な実装ですICommand

Command@JleruOHePが言うように、部分的に問題はとのセッターを交換することで解決できますCommandParameter。しかし、これは醜い方法です。毎回シーケンスを覚えておく必要があるからです。

より正しい方法は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());
    }
}

現在、セッターの順序は無関心です。
どのように機能するかを理解するために、 JoshSmithからのこのCommandManager素晴らしい記事を読むことができます。

于 2012-08-24T06:52:10.490 に答える
5

最も簡単な答え-コマンドとコマンドパラメータの場所を切り替える:

<Button CommandParameter="Hello" Command="{StaticResource hwc}" .../>

しかし、より良いものは@Dennisによって与えられます

于 2012-08-24T06:42:13.273 に答える
0

私の場合CommandParameter、問題を引き起こしているのはそのタイプでした。私のボタンは単純に次のようにバインドされていました。

<Button Content="New" Command="{Binding NewCommand}" CommandParameter="False" />

原資産NewCommandRelayCommand<bool>です。どういうわけか、XAMLはFalseboolに変換できませんでした。(多くの組み込みのタイプとプロパティで機能することに注意してください。おそらく、TypeConverterそこで動作しているものがあります)。

CommandParameter解決策は、次のように、実際の基になるタイプについてXAMLを単純にスプーンフィードすることでした。

<Button Content="New" Command="{Binding NewCommand}">
    <Button.CommandParameter>
        <sys:Boolean>
          False
        </sys:Boolean>
    </Button.CommandParameter>
</Button>

sys次のように、XAMLファイルの先頭に名前空間をインポートする必要があります。

xmlns:sys="clr-namespace:System;assembly=mscorlib"

これが将来の誰かに役立つことを願っています。

于 2016-08-16T08:07:28.863 に答える