などのボタンの特定のイベントによって、ViewModel のコマンドをどのように呼び出すことができますMouseDoubleClick
か?
3 に答える
は、いわゆる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 の学習を楽しんでください。それだけの価値があります。
箱から出してすぐに使用できるWPFからコマンドとイベントのバインドを使用する場合は、自分で多くの計画を立てる必要があります。MVVM LightToolkitやCliburnMicroなど、すでにコマンドとバインディングを提供している既存のフレームワークを使用するだけで、多くのことを得ることができます。
添付されたコマンド動作を使用できます