ListBox
を介してデータを表示する WPF/MVVM アプリがありますDataTemplate
。ListBox
ボタンを押したときにで選択した項目を変更して にCommandParameter
リンクすることができましたListBox
がSelectedItem
、同じ方法でボタンを正しく有効/無効にすることはできません。たとえば、2 つのアイテムがあり、一方のボタンを有効にし、もう一方のボタンを無効にする必要がある場合、要素を選択すると両方のボタンが同じ状態になり、別のアイテムを選択すると両方の状態が変化します。
RelayCommand
多くのMVVMフレームワークで使用されているものを使用しています。
これが私のXAMLです(「面白くない」部分を削除しました):
<UserControl.Resources>
<DataTemplate x:Key="ItemTemplate">
<Grid>
<Button Content="Something" Name="EnabledDisabledButton" Click="Button_Click"
Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type UserControl}}, Path=DataContext.SomeCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListBox}}, Path=SelectedItem}"/>
</Grid>
</DataTemplate>
<Style TargetType="{x:Type ListBoxItem}" x:Key="ContainerStyle">
<Setter Property="ContentTemplate" Value="{StaticResource ItemTemplate}" />
</Style>
</UserControl.Resources>
<ListBox x:Name="myListBox" ItemsSource="{Binding ElementList}"
IsSynchronizedWithCurrentItem="True" ItemContainerStyle="{StaticResource ContainerStyle}"/>
SelectedItem
をパラメータとしてRelayCommand
のメソッドに渡そうとしましCanExecute
たが、結果は以前と同じでした。
ListBoxItem
ボタンが「住んでいる」実際のパラメータをコマンドに渡す方法はありますか?そのため、それぞれがCanExecute
メソッドによって個別に処理されますか? これを手に入れたらうまくいくでしょうか?(現在Click
、コマンドを実行する前に、リスト内の正しい項目を選択するイベントを処理しています)。
私の方法では、対応するボタンを有効/無効にするためにCanExecute
、のプロパティを評価しています。SelectedItem
別の方法は、すべての要素に対してこのプロパティを評価することですが、 内でそれを行う方法が思いつかず、結果をビューに伝えます (アイテムにViewModel
を使用しているときに可能であれば)。DataTemplate
ご意見をお寄せいただきありがとうございます。