MVVM Light - usage of RaiseCanExecuteChanged for RelayComman



我使用MVVM模式。在我的视图中,我有Person details的文本框,其中一个是idBox。此外,视图由几个按钮组成,其中一个按钮是editModeBtn。

我希望editModeBtn只有在idBox内部有一个有效的int时才启用。

editBtn的Xaml(在视图内)如下所示:

<Button x:Name="editModeBtn" Content="Edit" Command="{Binding ChangeToEditScreenCommand}"  CommandParameter="{Binding ElementName=idBox, Path=Text}"></Button>
在相应的viewModel中,我有以下代码:
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事件,但这不是这里的情况。从来没有使用过raisecanexecutechange,所以只是想确保。谢谢!

你为什么要走CommandParameter的路线?你不能用UpdateSourceTrigger=PropertyChanged绑定你的TextBox.Text属性到虚拟机。这应该使VM中的Text的绑定属性在文本框中的文本发生变化时得到更新,而不是默认值,当文本框失去焦点时。

在你的情况下,这似乎是你想要的行为。因此,所有您需要的是一个RelayCommand为您的命令,而不是一个RelayCommand<T>与参数。

输入简单的xaml,显示上面的方法:

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

和在虚拟机中:

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的属性setter有点类似于关联TextBox的textChanged事件处理程序(我这么说是因为现在每当文本框中的文本发生变化时,setter都会被调用)

所以绝对保证你的CanExecute()被调用时,文本的变化,你可以调用ButtonCommand.RaiseCanExecuteChanged()Title属性设置,你引发它的PropertyChanged事件。

相关内容

  • 没有找到相关文章

最新更新