0

私はMVVMパターンを使用しています。私の見解では、人の詳細用のテキストボックスがあり、そのうちの 1 つが idBox です。また、ビューはいくつかのボタンで構成されており、そのうちの 1 つが editModeBtn です。

idBox 内に有効な int がある場合にのみ、editModeBtn を有効にしたいと考えています。

editBtn の Xaml (ビュー内) は次のようになります。

<Button x:Name="editModeBtn" Content="Edit" Command="{Binding ChangeToEditScreenCommand}"  CommandParameter="{Binding ElementName=idBox, Path=Text}"></Button>

対応するビューモデルには、次のコードがあります。

private RelayCommand<string> _changeToEditScreenCommand;

    public RelayCommand<string> ChangeToEditScreenCommand
    {
        get
        {
            if (_changeToEditScreenCommand == null)
            {
                _changeToEditScreenCommand = new RelayCommand<string>((param) => ChangeToEditScreen(), (param) => CanEdit(param));
            }

            return _changeToEditScreenCommand;
        }
    }

また、CanExecute メソッド (私の場合は CanEdit) で、パラメーター (id) が有効な int に設定されているかどうかを確認し、true を返したいと考えています。そうでなければ、偽。

private bool CanEdit(string currentInsertedId)
    {
        int idValue;
        bool result = Int32.TryParse(currentInsertedId, out idValue);
        if (result)
        {
            if (idValue > 0) { return true; };
            return false;
        }
        return false;
    }

基本的に、idBox に何かが書き込まれたり削除されたりするたびに、コマンドの canExecute メソッドが呼び出されるようにします。コマンドの RaiseCanExecuteChanged() はどこに置くべきですか? MVVM を使用していない場合は、textBox の textChanged イベントに入れることができますが、ここではそうではありません。RaiseCanExecuteChanged を使用したことがないので、確認したいだけです。ありがとう!

4

1 に答える 1

3

なぜあなたはaを通過するルートを下っていCommandParameterますか?TextBox.Textを使用してプロパティを VM にバインドすることはできませんかUpdateSourceTrigger=PropertyChanged。これにより、TextBox がフォーカスを失ったときのデフォルトではなく、TextBox 内のテキストが変更されるとすぐに、VM 内の Text のバインドされたプロパティが更新されます。

あなたの場合、これはあなたが望むと思われる動作です。したがって、必要なのはRelayCommandコマンドの でありRelayCommand<T>、パラメーターの ではありません。

したがって、上記のアプローチを示す単純な xaml と言います。

<TextBox Text="{Binding Title, UpdateSourceTrigger=PropertyChanged}" />
<Button Command="{Binding ButtonCommand}"
        Content="My Button" />

そしてVMで:

public string Title {
  get {
    return _title;
  }

  set {
    if (_title == value) {
      return;
    }

    _title = value;
    RaisePropertyChanged(() => Title);
  }
}

public RelayCommand ButtonCommand { get; private set; }

private bool CanEdit(string title) {
  int idValue;
  bool result = Int32.TryParse(title, out idValue);
  if (!result) {
    return false;
  }

  return idValue > 0;
}

ctor() {
  ButtonCommand = new RelayCommand(() => Debug.WriteLine("Called"), () => CanEdit(Title));
}

これだけでクエリが達成されます。しかし、あなたの質問RaiseCanExecuteChanged()Title

したがって、テキストが変更されたときに確実にCanExecute()呼び出されるようにするには、PropertyChanged イベントを発生させるプロパティ セッターButtonCommand.RaiseCanExecuteChanged()から呼び出すことができます。Title

于 2014-06-15T08:48:54.377 に答える