1

MVVM パターンに従って、Windows ストア アプリケーションがあります。GridView コントロールを含む親ビュー (一致する親 ViewModel を持つ) があります。その GridView コントロールの ItemTemplate には、子ビューが含まれています。その子ビューには、いくつかのボタンが含まれています。

ユーザーが ChildView コントロールの 1 つのボタンをクリックすると、親 ViewModel でメソッドが呼び出されるようにするにはどうすればよいですか?

4

2 に答える 2

1

これには 2 つの方法があります。

  • 最初に使用できるのは、作業を行うことができる親ビューモデルで定義されているコマンドにボタンをバインドすることです。
  • 2 つ目は、mvvm メッセンジャー クラスを使用できることです。ボタンクリックイベントハンドラからビューモデルにメッセージを送信する必要があります。このメッセージを受け取ったら、イベントハンドラを追加してそこで作業を行ってください。
于 2013-07-04T05:17:31.440 に答える
0

これが私がこの問題を解決する方法でした。

  1. 子ビューのコード ビハインドに、ICommand でサポートされている依存関係プロパティを追加します。

    public static readonly DependencyProperty ChildButtonCommandProperty = DependencyProperty.Register("ChildButtonCommand", typeof(ICommand), typeof(ChildView),new PropertyMetadata(null, OnChildButtonCommandChanged));
    
    public ICommand ChildButtonCommand
    {
        get { return (ICommand)GetValue(ChildButtonCommandProperty); }
        set { SetValue(ChildButtonCommandProperty, value); }
    }
    
    private static void OnChildButtonCommandChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        var self = (ChildView)sender;
        self.ChildButtonCommand.Command = (ICommand)e.NewValue;
    }
    
  2. 親 ViewModel で、 https ://relaycommandrt.codeplex.com/ にある RelayCommand で実装された ICommand 型のパブリック ゲッター プロパティを追加します。

  3. 親ビューの Xaml で、子ビューに ChildButtonCommand をバインドします。

    <GridView.ItemTemplate>
    <DataTemplate>
        <views:ChildView ChildButtonCommand="{Binding ElementName=ParentView, Path=DataContext.PropertyOnParentViewModel}"/>
    </DataTemplate>
    

バインディング構文を詳しく調べてください。GridView アイテムの DataTemplate にいるため、DataContext は親ビュー モデルではありません(子アイテム オブジェクトです)。ボタン コマンドを親ビュー モデルにバインドする場合は、親ビュー内の何かへの参照が必要です。この場合、ビューに「ParentView」という名前を付けました。Binding ElementName 構文を使用して、ParentView の DataContext、具体的には ParentViewModel のプロパティにバインドできます。

于 2013-07-05T00:09:55.920 に答える