我有一个显示为ShowDialog的窗口 在窗口中我有一些文本框绑定到实现INotifyPropertyChannges和IDataErrorInfo的对象。 我希望只有在验证了所有的文本框时才会启用“确定”按钮 我想要的只是当用户点击OK但是下一步将会发生。
我可以将按钮绑定到ICommand并检查CanExcute()中的文本框valitation但是我可以在Excute中做什么?对象不了解窗口。 我也可以检查textboxes valitation,然后引发所有有效的事件并启用OK按钮,但之后会有dupliacte代码,因为我已经在IDataErrorInfo implmention中检查了。
那么正确的方法是什么?
提前致谢
答案 0 :(得分:0)
你的CanExecute应该是这样的。
public bool CanExecuteOK
{
get
{
if (DataModelToValidate.Error == null && DataModelToValidate.Errors.Count == 0) return true;
else return false;
}
}
这里的错误和错误属性只不过是这个[string propertyName]的Wrapper(对IDataErrorInfo隐式实现)。
以下是样本模型类:
public class SampleModel: IDataErrorInfo, INotifyPropertyChanged
{
public SampleModel()
{
this.Errors = new System.Collections.ObjectModel.ObservableCollection<string>();
}
private string _SomeProperty = string.Empty;
public string SomeProperty
{
get
{
return _SomeProperty;
}
set
{
if (value != _SomeProperty)
{
_SomeProperty= value;
RaisePropertyChanged("SomeProperty");
}
}
}
....
....
//this keeps track of all errors in current data model object
public System.Collections.ObjectModel.ObservableCollection<string> Errors { get; private set; }
//Implicit for IDataErrorInfo
public string Error
{
get
{
return this[string.Empty];
}
}
public string this[string propertyName]
{
get
{
string result = string.Empty;
propertyName = propertyName ?? string.Empty;
if (propertyName == string.Empty || propertyName == "SomeProperty")
{
if (string.IsNullOrEmpty(this.SomeProperty))
{
result = "SomeProperty cannot be blank";
if (!this.Errors.Contains(result)) this.Errors.Add(result);
}
else
{
if (this.Errors.Contains("SomeProperty cannot be blank")) this.Errors.Remove("SomeProperty cannot be blank");
}
}
......
return result;
}