2

私はWPFが初めてなので、私がやっていることに意味があるかどうかはわかりません..とにかく:ApplicationCommands.Openを使用するボタンのコマンドを実装しようとしています。私のXAMLには次のものがあります。

<Window x:Class="MainWindow"                
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"                
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"                
        xmlns:local="clr-namespace:ViewModel"                
        Title="MainWindow" Height="650" Width="1170">                
    <Window.DataContext>                
        <local:ResourceListViewModel/>                
    </Window.DataContext>

local:ResourceListViewModel クラスにコマンドを定義したいので、これまでのところ、次のようにしました。

void OpenCmdExecuted(object target, ExecutedRoutedEventArgs e)
        {

            MessageBox.Show("The command has been invoked");
        }

        void OpenCmdCanExecute(object sender, CanExecuteRoutedEventArgs e)
        {
            e.CanExecute = true;
        }

したがって、私がしなければならないと思うのは、これらのメソッドをコマンドにバインドすることです。そのため、次のようにしようとしています。

 <Window.CommandBindings >
        <CommandBinding Command="ApplicationCommands.Open"
                  Executed="OpenCmdExecuted"
                  CanExecute="OpenCmdCanExecute"/>
    </Window.CommandBindings>

しかし、MainWindow でこれらの関数を探しているように見えるため、プログラムはコンパイルされていません。関数の定義が別のクラスにあることをプログラムに知らせるにはどうすればよいですか?

4

1 に答える 1

1

これは、MVVM でコマンドが機能する方法ではありません。RoutedCommands ( などApplicationCommands.Open) とDelegateCommands (別名s)には違いがありRelayCommandます。

1 つ目はビュー関連であり、ビジュアル ツリーをバブルアップするなどであり、コード ビハインドでビューによって処理する必要があります。

2 つ目は ViewModel 関連で、ViewModel で定義されています (つまり、Command インスタンスは ViewModel 自体のプロパティ メンバーです)。

public class ResourceListViewModel
{
    public RelayCommand OpenCommand {get;set;}

    public ResourceListViewModel()
    {
        OpenCommand = new RelayCommand(ExecuteOpenCommand, CanExecuteOpenCommand);
    }

    //etc etc
}
于 2013-01-18T17:06:43.777 に答える