Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在模型中出现错误时与ViewModel通信_C#_Wpf_Validation_Mvvm - Fatal编程技术网

C# 在模型中出现错误时与ViewModel通信

C# 在模型中出现错误时与ViewModel通信,c#,wpf,validation,mvvm,C#,Wpf,Validation,Mvvm,我有一个使用MVVM模式的应用程序,我希望在用户填写信息时实现验证。例如,如果最小值大于最大值,我想禁用视图中的按钮 public class MyViewModel : INotifyPropertyChanged { private ObservableCollection<MyModel> stocks; public ObservableCollection<MyModel> Stocks { get { return st

我有一个使用MVVM模式的应用程序,我希望在用户填写信息时实现验证。例如,如果最小值大于最大值,我想禁用视图中的按钮

public class MyViewModel : INotifyPropertyChanged
{
    private ObservableCollection<MyModel> stocks;
    public ObservableCollection<MyModel> Stocks
    {
        get { return stocks; }
        set { stocks = value; }
    }

    private bool canUpdate = true;
    public bool CanUpdate
    {
        get { return canUpdate; }
        set { canUpdate = value; }
    }        

    public MyViewModel()
    {
        AddStocks();
    }

    public void AddStocks()
    {
        Stocks = new ObservableCollection<MyModel>();
        Stocks.Add(new MyModel() { Stock ="Stock 1", Min = 10, Max=20 });
        Stocks.Add(new MyModel() { Stock = "Stock 2", Min = 5, Max = 15 });
        Stocks.Add(new MyModel() { Stock = "Stock 3", Min = 6, Max = 25 });
    }

    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChange(string name)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(name));
        }
    }
我已经在模型中实现了IDataErrorInfo。这是我的模型:

public class MyModel : IDataErrorInfo, INotifyPropertyChanged
{
    private string stock;
    public string Stock
    {
        get { return stock; }
        set { stock = value; }
    }

    private double min;
    public double Min
    {
        get { return min; }
        set { min = value; OnPropertyChange("Min"); }
    }

    private double max;
    public double Max
    {
        get { return max; }
        set { max = value; OnPropertyChange("Max"); }
    }

    public string Error
    {
        get { throw new NotImplementedException(); }
    }

    public string this[string columnName]
    {
        get
        {
           string  error = string.Empty;
            if (columnName == "Min" || columnName == "Max")
            {
                if (Min > Max)
                {
                    error = "Min can't be greater than Max";
                }
            }
            return error;
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChange(string name)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(name));
        }
    }
}
我的ViewModel有一个MyModel集合(绑定到DataGrid)和一个名为CanUpdate的布尔属性。此CanUpdate绑定到我的视图中更新按钮的IsEnabled属性

public class MyViewModel : INotifyPropertyChanged
{
    private ObservableCollection<MyModel> stocks;
    public ObservableCollection<MyModel> Stocks
    {
        get { return stocks; }
        set { stocks = value; }
    }

    private bool canUpdate = true;
    public bool CanUpdate
    {
        get { return canUpdate; }
        set { canUpdate = value; }
    }        

    public MyViewModel()
    {
        AddStocks();
    }

    public void AddStocks()
    {
        Stocks = new ObservableCollection<MyModel>();
        Stocks.Add(new MyModel() { Stock ="Stock 1", Min = 10, Max=20 });
        Stocks.Add(new MyModel() { Stock = "Stock 2", Min = 5, Max = 15 });
        Stocks.Add(new MyModel() { Stock = "Stock 3", Min = 6, Max = 25 });
    }

    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChange(string name)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(name));
        }
    }
公共类MyViewModel:INotifyPropertyChanged
{
私人可观测集合股票;
公开募股
{
获取{返回股票;}
设置{stocks=value;}
}
private bool canUpdate=true;
公共图书馆更新
{
获取{return canUpdate;}
设置{canUpdate=value;}
}        
公共MyViewModel()
{
AddStocks();
}
公开发行股票()
{
股票=新的可观察集合();
添加(新的MyModel(){Stock=“Stock 1”,最小值=10,最大值=20});
添加(新的MyModel(){Stock=“Stock 2”,最小值=5,最大值=15});
添加(新的MyModel(){Stock=“Stock 3”,Min=6,Max=25});
}
公共事件属性更改事件处理程序属性更改;
公共void OnPropertyChange(字符串名称)
{
if(PropertyChanged!=null)
{
PropertyChanged(此,新PropertyChangedEventArgs(名称));
}
}

用户可以从DataGrid编辑最小值和最大值。每当MyModel中出现错误时进行编辑时,必须更新MyViewModel中的CanUpdate属性。请指导我实现这一点。

在视图模型中,将项目添加到其
PropertyChanged
事件的集合挂钩时。在处理程序中分析
错误属性和修改
可以相应地更新