【问题标题】:Binding errors in MVVMMVVM 中的绑定错误
【发布时间】:2014-07-21 06:19:10
【问题描述】:

当绑定到 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?

【问题讨论】:

  • 网上有很多关于如何实现IDataErrorInfo的文章,比如herehere你试过了吗?
  • @RohitVats 我做了,但是,这里的验证是在模型上进行的,我无法在ViewModel中得到它的值

标签: c# wpf mvvm binding .net-4.5


【解决方案1】:

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

【讨论】:

  • 我为什么不应该在模型中引发PropertyChanged 事件?
  • 首先您应该绑定到您的视图模型,以便您可以使用 IDataErrorInfo 并验证您的视图模型。 IDataErrorInfo 等验证逻辑不应该在您的模型中,您的模型应该只包含一个对象及其属性。 en.wikipedia.org/wiki/Model_View_ViewModel#mediaviewer/… 使用该链接,您还可以看到 mvvm 模式意味着您的视图仅与您的 viewModel 对话,并且 viewmodel 从模型向上传递数据。目前看来您的视图正在直接与模型对话
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-20
  • 1970-01-01
  • 1970-01-01
  • 2017-03-28
  • 2017-12-25
  • 2012-05-26
  • 2010-11-10
相关资源
最近更新 更多