31

私はこのウェブとグーグルを見ましたが、解決策はうまくいきませんでした。

UserControl の ViewModel にコマンドがあります。さて、ユーザー コントロールには、ObservableCollection にバインドされた ItemsControl があります。ItemsControl.ItemTemplate の DataTemplate 内にボタンがあり、コマンドを使用したいと考えています。DataTemplate 内では、datacontext は ViewModel ではなく ObservableCollection のアイテムであるため、コマンドをバインドできません。

問題は次のとおりです。親データコンテキストが失われた場合、ボタンをコマンドにバインドするにはどうすればよいですか?

これはよくある問題だと思うので、簡単な解決策が必要だと思います。

このシナリオを想像してみてください:

ItemsSource として observableCollection を持つ ListBox 項目があるため、コレクション内のすべての要素に対して ListBox 内でデータ テンプレートを使用しています。さて、選択したアイテムを削除したいので、そのジョブのすべての行にボタンを配置します。¿あなたはそれをどのようにしますか?

MVP では、ボタンのクリック イベントでこれを行うことができます。

Button but = e.Source as Button;

if (but != null)
      Presenter.ActualNote = but.DataContext as Note;

要するに。行 (選択した項目) のデータ コンテキストをプレゼンターに送信します。

しかし、どうすればmvvmの方法でそれを行うことができますか? コマンドを使用する必要がありますが、ボタンは ViewModel (コマンドが存在する場所) について何も知らないため、コマンドをボタンに割り当てることができません。

ご覧のとおり、ボタンは datatemplate 内に存在する必要があり、datacontext はもはや ViewModel ではありません.... コマンドにアクセスするために、親の DataContext にアクセスする必要があるのはそのためです。

あなたが私の問題をよりよく理解してくれることを願っています。

ありがとうございました。

4

4 に答える 4

91

ボタンのコマンドには、以下のバインディングを使用します。

{Binding DataContext.CommandName, 
         RelativeSource={RelativeSource FindAncestor, 
                         AncestorType={x:Type MyUserControl}}}

これにより、UserControl を見つけてその DataContext を使用するように指示されます。

于 2009-06-15T20:09:58.817 に答える
5

汚い、MVVMを壊すソリューションが必要な場合は、ボタンにTag = "{Binding}"を設定し、Clickイベントを処理します。イベントハンドラーで、ViewModelでコマンドを呼び出します。

于 2009-06-15T21:10:13.650 に答える
3

では、モデル ビュー全体を参照するプロパティを持つようにデータ項目クラスを変更するのはどうでしょうか。

ItemsSource がタイプの場合、次のObservableCollection<DataItem>ように DataItem タイプを変更します。

public class DataItem
{
    public BusinessObject Value { get; set; }

    private ModelView modelView;

    public ModelView ModelView
    {
        get
        {
            return modelView;
        }
    }

    public DataItem(ModelView modelView)
    {
        this.modelView = modelView;
    }
}
于 2009-06-17T06:07:28.450 に答える
2

RelativeSource は機能しますが、コントロールが互いのプロパティをうろつくのは正しくないと思います。アイテム ビュー内に配置されたボタンが、バインドされたアイテムではなく外部データ ソースに対して何かを行うのは奇妙です。プログラム コードの設計を確認する必要がある場合があります。

于 2009-06-15T20:58:09.373 に答える