C# 获取所有绑定属性的列表

C# 获取所有绑定属性的列表,c#,wpf,mvvm,C#,Wpf,Mvvm,获取ViewModel中所有数据绑定属性列表的最有效方法是什么。我有一个窗口,它有一个ViewModel和多个用户控件,这些控件根据用户选择显示。我使用IDataErrorInfo进行验证。我想知道绑定到哪些属性,以便在用户单击“保存”按钮时只能验证这些属性 下面是我当前的实现,我担心一些属性可能会出现在列表中,并被错误地验证 public class ViewModel : IDataErrorInfo { private bool _validate = false; pr

获取ViewModel中所有数据绑定属性列表的最有效方法是什么。我有一个窗口,它有一个ViewModel和多个用户控件,这些控件根据用户选择显示。我使用IDataErrorInfo进行验证。我想知道绑定到哪些属性,以便在用户单击“保存”按钮时只能验证这些属性

下面是我当前的实现,我担心一些属性可能会出现在列表中,并被错误地验证

public class ViewModel : IDataErrorInfo
{
    private bool _validate = false;

    private List<string> _boundProperties = new List<string>();

    private void OnPropertyBound(string propertyName)
    {
    }

    public string Property1
    {
        get { OnPropertyBound("Property1"); return "value1"; }
    }

    public string Property2
    {
        get { OnPropertyBound("Property2"); return "value2"; }
    }

    public string Error
    {
        get
        {
            return null;
        }
    }

    public string this[string columnName]
    {
        get
        {
            if (!_boundProperties.Contains(columnName)) return null;
            if (!_validate) return null; // Set to true when user tries to save. OnPropertyChanged event also fired to refresh the bindings afterwards.

            string errorMessage = string.Empty;
            switch (columnName)
            {
                case "Property1":
                    // Some validation code that sets the errorMessage
                    break;
                case "Property2":
                    // Some validation code that sets the errorMessage
                    break;
            }

            return errorMessage;
        }
    }
}
公共类视图模型:IDataErrorInfo
{
私有bool _validate=false;
私有列表_boundProperties=新列表();
私有void onPropertyBond(字符串propertyName)
{
}
公共字符串属性1
{
获取{onPropertyBond(“Property1”);返回“value1”}
}
公共字符串属性2
{
获取{onPropertyBond(“Property2”);返回“value2”;}
}
公共字符串错误
{
得到
{
返回null;
}
}
公共字符串此[string columnName]
{
得到
{
如果(!\u boundProperties.Contains(columnName))返回null;
if(!\u validate)返回null;//在用户尝试保存时设置为true。OnPropertyChanged事件也会在之后触发以刷新绑定。
string errorMessage=string.Empty;
开关(列名称)
{
案例“财产1”:
//设置错误消息的一些验证代码
打破
案例“财产2”:
//设置错误消息的一些验证代码
打破
}
返回错误消息;
}
}
}

我不确定您是否应该在ViewModel中使用此案例,但它可以帮助您。重复?这个问题应该对你想做的事情有所帮助。这真是个坏主意。以上给出的建议将比简单地验证所有内容花费更多的时间和精力。不要在这上面浪费时间。我甚至不知道有什么切实可行的方法来实现这一点。假设视图模型使用的是
INotifyPropertyChanged
,那么模型和绑定目标之间甚至没有每个属性的关系。您必须检查事件处理程序,即使这样,处理程序的编写方式也可能使静态分析无法提供所需的信息。如果没有一个好的程序,这很难确定,但听起来你可能滥用了属性绑定系统,并为自己设置了很多以后很难找到、很难修复的bug。