3

MVVM / WPF環境で、ListViewComputeCommandのイベントが発生したときに、ViewModelでコマンド()を呼び出したいと思います。SelectionChangedXAMLまたはC#のいずれかでこれをどのように行うことができますか?

これが私のコマンドクラスです。コードビハインドで試しMainViewModel.Instance.MyCommand.Execute();ましたが、受け入れられません。

public class ComputeCommand : ICommand
{
    public ComputeCommand(Action updateReport)
    {
        _executeMethod = updateReport;
    }

    Action _executeMethod;

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
        _executeMethod.Invoke();
    }
}       
4

4 に答える 4

2

あなたの質問に答えるために-あなたはパラメータを欠いています。この呼び出しは機能するはずです:

MainViewModel.Instance.MyCommand.Execute(null);

ただし、そのためにICommandは必要ありません。このインターフェイスは、異なる目的を果たします。

必要なのは、ビュー側でSelectionChangedを処理することです。

var vm = DataContext as YourViewModelType;
if (vm != null)
{
    vm.Compute(); //some public method, declared in your viewmodel
}

または、アイテムコンテナのIsSelectedプロパティにバインドして、viewmodel側で処理します

于 2013-03-07T09:24:58.150 に答える
2

MVVM LightのようなMvvmフレームワークを使用することを強くお勧めします。そうすれば、次のようなことができます。

XAML:

xmlns:MvvmLight_Command="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras"
xmlns:Custom="clr-namespace:System.Windows.Interactivity;  assembly=System.Windows.Interactivity"

 <ListBox>
 ...
     <Custom:Interaction.Triggers>
          <Custom:EventTrigger EventName="SelectionChanged ">
             <MvvmLight_Command:EventToCommand PassEventArgsToCommand="False" Command="{Binding Path=ComputeCommand}"/>
          </Custom:EventTrigger>
     </Custom:Interaction.Triggers>

</Listbox>

ViewModel:

public RelayCommand ComputeCommand{ get; private set; }

これは、イベントの配線をクリーンで整頓された状態に保つためのエレガントな方法です。

于 2013-03-07T10:03:26.543 に答える
1

一般的に:コントロールのイベントが発生したときにコマンドを呼び出すには、EventTriggersを使用できます。

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

これを行うには、XAMLでSystem.Windows.Interactivity.dllを参照する必要があります。

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

そうは言っても、一般的なコマンドの実装を簡素化するには、MVMMフレームワーク(MVVMなど)を使用する必要があります。必要なコマンドごとに単一のクラスを使用することは、長期的には維持できません。MVVMLightやPRISMのようなフレームワークはDelegateCommands、デリゲート(ViewModelのメソッド)から直接新しいコマンドを作成できるようにします。

于 2013-03-07T10:25:40.843 に答える
0

まず、のバインディングを定義する必要があるCommandため、コマンドの呼び出し時に実行する必要のある関数です。

これは、次のようにXAMLで実行できます。

<CommandBinding Command="name_of_the_namespace:ComputeCommand" Executed="ComputeCommandHandler" />

その後、たとえば、あるクラスで次のようなコマンドを初期化できます。

 public class AppCommands {
    public static readonly ICommand ComputeCommand = 
             new   RoutedCommand("ComputeCommand", typeof(AppCommands));
 }

そしてその後は次のように使用できます:

 AppCommands.ComputeCommand.Execute(sender);

パターンを扱う場合はWPFMVVM通常よりもはるかに多くのコードを記述する必要がありますが、その柔軟性の恩恵を受けます。

于 2013-03-07T09:19:32.747 に答える