0

ListBoxを介してデータを表示する WPF/MVVM アプリがありますDataTemplateListBoxボタンを押したときにで選択した項目を変更して にCommandParameterリンクすることができましたListBoxSelectedItem、同じ方法でボタンを正しく有効/無効にすることはできません。たとえば、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

ご意見をお寄せいただきありがとうございます。

4

2 に答える 2

1

私のコメントを回答に変換する:

だけではないのはなぜCommandParameter="{Binding}"ですか?

于 2012-12-27T01:36:03.417 に答える
1

質問で「MVVM」について言及していますが、MVVMの方法を最大限に活用しているようです。

スタイルに Button_Click イベントはまったくありません。これは、実際にはスタイルであり、定義ごとに同じイベントを持たない別のスタイルに変更される可能性があるためです。これにより、将来スタイルベースのアプリを使用することを選択した場合、アプリケーションが意図したとおりに動作しなくなります。 . 私が使用するルールは、スタイルはスタイルであるということです。スタイルは、アプリの UI と「外観」に関係しています。機能は UI から分離する必要があります。プログラマーはコマンドを定義でき、デザイナーはユーザーがそれをどのように使用するのが最善かを決定できます。

ここで、MVVM パターンからのコードの分離が明らかになりました。「見た目」とユーザーの行動、およびアプリのロジックを分離します。同様に...コマンドがボタン、メニュー、データコンテキスト、またはキーストロークから起動されるかどうかは、モデルにとって重要ではありません。

この特定の問題が私に処理された場合、HOLDER クラスを使用して解決します。これは、ICommand プロパティと、ListBox のさまざまな行に表示される「行」を保持するクラス (INotifyPropertyChanged を実装する DependencyObject) です。

ICommand プロパティは Button にバインドされ、行 (クラス) 自体が CommandParameter として呼び出されます。次に、ListBox の ItemTemplate で実際の行を使用し、さまざまな要素 (コンバーターの有無にかかわらずプロパティ) へのバインディングを使用して、必要な表示を利用できるようにします。

十分に説明したことを願っています...私のソリューションの代替案の詳細が必要な場合は、お気軽にお問い合わせください。

于 2012-12-26T22:47:48.480 に答える