2015年11月18日水曜日

MenuItem.CommandParameterが初回nullとなるWPFのバグ

MenuItem.CommandParameterが初回nullとなるWPFのバグ

<MenuItem.ItemContainerStyle>
  <Style TargetType="MenuItem">
  <Setter Property="Header" Value="{Binding Name}" />
  <Setter Property="Command" Value="{Binding SomeCommand}" />
  <Setter Property="CommandParameter" Value="{Binding}" />
  </Style>
</MenuItem.ItemContainerStyle>

フォーラムで2009年という昔から語られている問題。
http://compositewpf.codeplex.com/discussions/47338

  • 長らく指摘されているが、重要度が微妙で未だにバグとして残っている。
  • CommandとCommandParameterの実装が別で行われてことがそもそもの発端。
  • Parameterが設定される前にCommandのCanExecuteが実行されてしまうのが原因。
  • XAMLの書き順を変えたらいいという情報もあるが、どうもうまくいかないらしい。

これの解決法は以下。

  • まず、parameterがnullで渡ってきた時の処理を追加する。Falseを返すなど。
  • Parameter添付プロパティを作成する。このプロパティの更新時、依存オブジェクトのCommand.RaiseCanExecuteChanged()を呼ぶ。PrismのDelegateCommandなら自分で実装する必要なし。
  • Xamlでは、my:DelegateCommandFix.ParameterをCommandParameterの代わりに記述する。

0 件のコメント:

コメントを投稿