Silverlight プロジェクトで複数のバインディングを持つコンバーターを使用すると、いくつかの問題が発生します。タスクは、カスタム コンバーターで 4 つのプロパティがどのように評価されるかに応じて、クリックされたときにボタンを無効にすることです。タスクの流れは次のとおりです。
- ボタンの初期化時に発生するコンバーター
- ボタンがクリックされ、ViewModel でコマンドが起動された
- ボタンの ID を 1 つの viewModel プロパティに記録する
- ViewModel で、3 つのビュー モデル プロパティのいずれかに対して OnPropertyChanged を起動します。
- これにより、コンバーターが起動します
最後のステップを除いて、すべてが機能しています。最後の 2 番目のステップでは、OnPropertyChanged が起動された後、Property が再びアクセスされていることがわかります。したがって、バインディングがこの変更を検出してコンバーターを起動しない理由がわかりません。ボタン項目がデータグリッドにあり、Path と ElementName を使用したバインディングが原因である可能性があると考えています。
ここから Silverlight 5 の MultiBinding ソリューションを使用しています。
そして、この質問を見てきましたが、その解決策は Silverlight (Binding.IndexerName) では利用できません。
したがって、実際のコントロールには、各行にテキストブロックとボタンがあるデータグリッドがあります。
Button IsEnabled は、ViewModel (プロパティ AC) からの 3 つの値と datagrid.ItemSource (Id) からの 1 つの値を持つ Converter にバインドされます。
<Button Tag="{Binding Id}"
IsEnabled="{multibinding:MultiBinding Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged,
Source1={Binding Path=DataContext.PropertyA, ElementName=LayoutRoot},
Source2={Binding Path=DataContext.PropertyB, ElementName=LayoutRoot},
Source3={Binding Id},
Source4={Binding Path=DataContext.PropertyC, ElementName=LayoutRoot},
Converter={StaticResource myConverter}}">
Button Click イベントは、viewModel のコマンドにバインドされています。
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<i:InvokeCommandAction Command="{Binding Path=DataContext.ClickCommand, ElementName=LayoutRoot}"
CommandParameter="{Binding Id}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
viewModel で OnPropertyChanged イベントを発生させる
public void OnClickCommand(int Id)
{OnPropertyChanged("PropertyA");}
実際には、コンバーターを再初期化して再起動するコントロール全体を更新するためのハックを配置しましたが、これを解決するための助けをいただければ幸いです。