MVVM绑定错误
本文关键字:错误 绑定 MVVM | 更新日期: 2023-09-27 18:13:42
当绑定到ViewModel时,框架默认处理一些验证,例如,如果文本字段被绑定到int属性,并且用户输入一个字母,则输入的边框变为红色。我读过IDataErrorInfo
和INotifyDataErrorInfo
,但无法成功实施(这就是我需要的方法)。
如果这是我的模型:
public class TestModel : ObservableObject
{
public int ModelId { get; set; }
public string ModelName { get; set; }
private int _modelNumber;
public int ModelNumber
{
get { return _modelNumber; }
set
{
_modelNumber = value;
RaisePropertyChanged();
}
}
}
我的视图模型:
public class TestViewModel : ObservableObject
{
private TestModel _selectedModel;
public TestModel SelectedModel
{
get { return _selectedModel; }
set
{
_selectedModel = value;
RaisePropertyChanged();
}
}
private ICommand _doSomthingCommand;
public ICommand DoSomthingCommand
{
get
{
if (_doSomthingCommand == null)
{
_doSomthingCommand = new CommandBase(doSomthing, canDosomething);
}
return _doSomthingCommand;
}
}
private bool canDosomething(object arg)
{
//check here if an error exists
}
private void doSomthing(object obj)
{
throw new NotImplementedException();
}
}
我怎么知道视图中有错误,并从canexecute方法返回false ?
我自己不是mvvm专家。但我想说的是,你的模型不应该引发属性改变事件。该属性应该在视图模型中。
private int _modelNumber;
public int ModelNumber
{
get { return SelectedModel.ModelNumber; }
set
{
SelectedModel.ModelNumber = value;
RaisePropertyChanged();
}
}
要实现IDataErrorInfo显然需要将其添加为接口
public class TestViewModel : ObservableObject, IDataErrorInfo
并实现接口
public string Error
{
get { return string.Empty; }
}
public string this[string propertyName]
{
get { return GetErrorForProperty(propertyName); }
}
private string GetErrorForProperty(string propertyName)
{
switch (propertyName)
{
case "ModelNumber":
if (test bool property here)
{
//if false
return "string";
}
else
{
//if true
return string.Empty;
}
default:
return string.Empty;
}
在视图绑定中,像这样:
Text="{Binding ModelNumber, ValidatesOnDataErrors=True}"