0

ここに私が持っている、

    private ICommand AddCommand = new RCommand(p => true, p => Add() );
    private void Add()
    {
        emp = new Employee();
        DetailsEntryGrid.DataContext = emp;

        EnableControls();
        tBoxID.Focus();
        tBoxID.SelectAll();
        //throw new NotImplementedException();
    }

vs2010は、「p」が非静的フィールドを指すことができないというコンパイル時エラーをスローし、グリッドとテキストボックスにアクセスできません..これらのコントロールはwpfです.従業員のオブジェクトも作成できません..

そしてRcommandクラスは..

public class RCommand : ICommand
{
    readonly Predicate<object> _CanExecute;
    readonly Action<object> _Execute;
    public RCommand(Action<object> exe) : this(null,exe)
    {

    }

    public RCommand(Predicate<object> predicate, Action<object> action)
    {
        if (predicate == null)
            throw new ArgumentNullException("execute must be provided");
        _Execute = action;
        _CanExecute = predicate;

    }

    public bool CanExecute(object parameter)
    {
        return _CanExecute == null ? true : _CanExecute(parameter);

    }

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    public void Execute(object parameter)
    {
        _Execute(parameter);

    }
}

その Add() メソッドにアクセスしたいのですが、その結果、テキスト ボックスとデータグリッドにアクセスしたいのですが、どのようにすればよいですか?

または、RCommand クラスをどのように持つべきですか?

4

1 に答える 1

2

初期化をクラスのコンストラクターに移動するだけです。

public MyClass()
{
    // other initialisation stuff
    AddCommand = new RCommand(p => true, p => Add() );
}

あなたのコメントから-これがMVVMの場合、ビューモデルのビューの要素にアクセスするべきではありません。それはクラス間の結合を増加させ、「悪いこと」です。

ビューの値を変更する必要がある場合は、バインディングを使用する必要があります。

フォーカスを変更してテキスト ボックス内のすべてのテキストを選択する場合は、テキスト ボックスにアクセスできる場合は、ビュー モデルからイベントを発生させ、ビューで処理する必要があります。

ビュー モデルでイベントを定義します。

public event EventHandler<MyEventArgs> MyEvent;

次に、反応したいことが起こったときにそのイベントを発生させます。

if (this.MyEvent != null)
{
    this.MyEvent(this, new MyEventArgs(...));
}

where...は、イベントで渡す必要がある値 (存在する場合) に置き換えられます。

ビュー コンストラクターで、このイベントをサブスクライブします。

this.viewModel.MyEvent += MyEventHandler;

ビューがビュー モデルへの参照を持っていることは問題ありませんが、その逆はありません。

ハンドラーは次のとおりです。

private void MyEventHandler(object sender, MyEventArgs e)
{
    // Do your stuff
}
于 2013-01-05T13:00:26.303 に答える