MVVM绑定错误

本文关键字:错误 绑定 MVVM | 更新日期: 2023-09-27 18:13:42

当绑定到ViewModel时,框架默认处理一些验证,例如,如果文本字段被绑定到int属性,并且用户输入一个字母,则输入的边框变为红色。我读过IDataErrorInfoINotifyDataErrorInfo,但无法成功实施(这就是我需要的方法)。
如果这是我的模型:

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绑定错误

我自己不是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}"