6

わかりました。コマンドは常に混乱を招くため、コマンドの使用を避ける傾向がありますが、私は新しいプロジェクトに取り組んでおり、コードを表示せずに正しく設計しようとしています。基本的に、私が今やろうとしているのは、ビューモデルでいくつかのことを実行するコマンドを起動するボタンを配線することだけですが、どういうわけか、非常に単純なことがまだ問題を引き起こしています。私は近くにいると思いますが、そこにたどり着くことができません。これが私が今持っているものです。

<Window.Resources>
    <RoutedUICommand x:Key="GetMusic" />
</Window.Resources>
<Window.DataContext>
    <core:ViewMain />
</Window.DataContext>
<Window.CommandBindings>
    <CommandBinding Command="{StaticResource GetMusic}" Executed="GetMusicExecuted"/>
</Window.CommandBindings>

そして、ビューモデルは今のところほとんど何もありません

public class ViewMain
{
    public MusicCollection Music { get; set; }

    private void GetMusicExecuted(object sender, ExecutedRoutedEventArgs e)
    {
        //Logic
    }
}

今私がやろうとしているのは、コマンドバインディングで設定したこのコマンドを接続して、ビューモデルで実行されたメソッドを呼び出すだけですが、ビュー自体の中でそのメソッドを見つけようとします。代わりにビューモデルのメソッドにそれを向けることができる方法、または同じことを達成するためにこれを設定するためのより良い方法はありますか?最初はシンプルにしたいと思っているので、早めに頭を悩ませることはありません。

4

1 に答える 1

12

私は自分のコマンドクラスを使用して、ICommandを実装する傾向があります。次に、ButtonCommandプロパティをビューモデルのcommandプロパティにバインドします。ボタンがクリックされると、Commandプロパティにバインドされているものは何でもExecuteメソッドが実行されます。

これは醜い2分間のバージョンですが、Commandクラスを作成し、ビューモデルで好きなメソッドにそのポイントをデリゲートに割り当てる方法を示しています。

ViewModel:

public class MyViewModel
{
    public MyCommand ActionCommand
    {
        get;
        set;
    }

    public MyViewModel()
    {
        ActionCommand = new MyCommand();
        ActionCommand.CanExecuteFunc = obj => true;
        ActionCommand.ExecuteFunc = MyActionFunc;
    }

    public void MyActionFunc(object parameter)
    {
        // Do stuff here 
    }

}

public class MyCommand : ICommand 
{
    public Predicate<object> CanExecuteFunc
    {
        get;
        set;
    }

    public Action<object> ExecuteFunc
    {
        get;
        set;
    }

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

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
        ExecuteFunc(parameter);
    }
}

したがって、ビューはそれにバインドされます(DataContextがビューモデルのインスタンスに設定されていると仮定します)。

<Window x:Class="exp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Button Command="{Binding Path=ActionCommand}">Action</Button>
    </Grid>
</Window>
于 2012-06-16T03:43:52.680 に答える