8

などのボタンの特定のイベントによって、ViewModel のコマンドをどのように呼び出すことができますMouseDoubleClickか?

4

3 に答える 3

26

は、いわゆるPrismフレームワークの一部でEventTriggerあるSystem.Windows.Interactivity名前空間で使用できます。MVVM を使い始めたばかりの場合は、今のところ Prism をあまり気にしなくてもかまいませんが、後で覚えておいてください。とにかく、あなたはスチールすることができますEventTrigger

それはこのように動作します:

アセンブリSystem.Windows.Interactivity.dllを参照します。

XAML で、名前空間を参照します。

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

次に、ボタンまたはその他のコントロールで、次のように EventTrigger を追加します。

<Button Content="Button">
   <i:Interaction.Triggers>
      <i:EventTrigger EventName="MouseDoubleClick">
         <i:InvokeCommandAction Command="{Binding CommandToBindTo}" 
                                CommandParameter="{Binding CommandParameterToBindTo}" />
      </i:EventTrigger>
   </i:Interaction.Triggers>
</Button>

このようにして、イベントをDataContextのCommandにバインドします。

述べる

使用法を明確にするために、ViewModel を含む実際の例を次に示します。架空の要件は、ユーザーがリスト内の項目を選択し、選択した項目をパラメーターとして受け取るコマンドを実行できるようにすることです。

<ListBox x:Name="ItemsList" ItemsSource="{Binding Items}" />

<Button Content="Do something with selected item">
   <i:Interaction.Triggers>
      <i:EventTrigger EventName="MouseDoubleClick">
         <i:InvokeCommandAction Command="{Binding DoSomethingCommand}" 
                                CommandParameter="{Binding SelectedItem, 
                                                   ElementName=ItemsList}" />
      </i:EventTrigger>
   </i:Interaction.Triggers>
</Button>

それが ViewModel になります。DelegateCommandコマンドのパラメーターがどのように使用されているかに注意してください。例では、すべての MVVM フレームワーク (場合によっては ) で取得されるオブジェクトの汎用バージョンを使用していますRelayCommand。このクラスは、必要なパラメーターの型をジェネリック パラメーターとして取り (ここでは ) ItemViewModel、対応するパラメーターを取るメソッドを必要とします (ここではExecuteDoSomethingWithItem(ItemViewModel ...))。残りは WPF マジックです。XAML でCommandParameterプロパティがバインドされているオブジェクトは、Execute(...)関数のパラメーターとして渡されます。

public class ViewModel
{
    ObservableCollection<ItemViewModel> Items { get; set; }

    public ICommand DoSomethingCommand
    {
        get
        {
            return _doSomethingCommand ??
                   (_doSomethingCommand = new DelegateCommand<ItemViewModel>(ExecuteDoSomethingWithItem));
        }
    }

    private DelegateCommand<ItemViewModel> _doSomethingCommand;

    private void ExecuteDoSomethingWithItem(ItemViewModel itemToDoSomethingWith)
    {
        // Do something
    }

    public ViewModel()
    {
        Items = new ObservableCollection<ItemViewModel>();
        // Fill the collection
    }
}

MVVM の学習を楽しんでください。それだけの価値があります。

于 2013-01-02T15:40:15.537 に答える
0

箱から出してすぐに使用できるWPFからコマンドとイベントのバインドを使用する場合は、自分で多くの計画を立てる必要があります。MVVM LightToolkitCliburnMicroなど、すでにコマンドとバインディングを提供している既存のフレームワークを使用するだけで、多くのことを得ることができます。

于 2013-01-02T13:47:37.660 に答える
0

添付されたコマンド動作を使用できます

=> http://geekswithblogs.net/HouseOfBilz/archive/2009/08/21/adventures-in-mvvm-ndash-generalized-command-behavior-attachments.aspx

于 2013-01-02T13:39:29.313 に答える