[英]MVVM Light - usage of RaiseCanExecuteChanged for RelayCommand
我正在使用MVVM模式。 在我看来,我有用于“个人”详细信息的文本框,其中之一是idBox。 此外,该视图由几个按钮组成,其中之一是editModeBtn。
我希望仅在idBox中有有效的int时才启用editModeBtn。
我的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事件中,但实际情况并非如此。 从未使用过RaiseCanExecuteChanged,因此只想确保即可。 谢谢!
为什么要沿着传递CommandParameter
的路走下去? 您不能仅使用UpdateSourceTrigger=PropertyChanged
将TextBox.Text
属性绑定到VM。 一旦TextBox中的文本更改,这应该获取VM中Text的bound属性更新,而不是TextBox失去焦点时的默认属性。
在您的情况下,这就是您似乎想要的行为。 因此,与所有你需要的是一个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
的属性设置器与关联的TextBox的textChanged事件处理程序有点相似(我说这是因为设置器现在每次在文本框中更改文本时都会被调用)
因此,要完全保证在文本更改时可以调用CanExecute()
,可以从Title
属性设置器中调用ButtonCommand.RaiseCanExecuteChanged()
,在该属性引发它的PropertyChanged事件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.