不会引发 Collection Changed 事件中的错误更改
Errors Changed inside Collection Changed event does not get raised
我的 VM 中有一个完整的属性:
public ObservableCollection<ServiceHost> ServiceHosts
{
get => serviceHosts;
set
{
if (serviceHosts == value) { return; }
serviceHosts = value;
OnPropertyChanged();
}
}
在我的 MainWindow 的另一个 ViewModel 中,我在 ServiceHosts 属性 上使用 CollectionChanged
事件来获取添加的项目,将其转换为我期望的类型并收听 ErrorsChanged
属于该类型的 属性 事件。
看起来像这样:
ServiceHostViewModel.ServiceHosts.CollectionChanged += ServiceHostsOnCollectionChanged;
private void ServiceHostsOnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.Action == NotifyCollectionChangedAction.Add)
{
if (e.NewItems[0] is ServiceHost newItems)
{
newItems.Validator = new ServiceHostValidator();
newItems.ErrorsChanged += (o, args) => UpdateAllErrors();
newServiceHost.ValidateAllProperties();
}
}
}
不幸的是,ErrorsChanged
事件从未触发 UpdateAllErrors
方法,即使单元格显示红色边框,此事件也不会执行,我不知道为什么。
这是一个工作示例,我也使用 ErrorsChanged
事件,但在这里我将数据从代码添加到 ServiceHosts
而不是 UI:
private void SetErrorsChangedEventToAllServiceHosts(XmlParserBase xmlParserBase)
{
foreach (var serviceHost in xmlParserBase.GetServiceHostClients(new ServiceHostValidator()))
{
ServiceHostViewModel.ServiceHosts.Add(serviceHost);
serviceHost.ErrorsChanged += (sender, args) => UpdateAllErrors();
}
}
为什么 ServiceHostsOnCollectionChanged
中的 ErrorsChanged 事件不起作用?
感谢您的帮助。
评论更新:
这是我模型中的一些代码 class
public class ServiceHost : INotifyDataErrorInfo
{
public IValidator<ServiceHost> Validator;
public ServiceHost(IValidator<ServiceHost> validator)
{
this.Validator = validator;
this.Validator.ErrorsChanged += (s, e) => OnErrorsChanged(e);
}
}
Unfortunately the ErrorsChanged event never triggers the UpdateAllErrors method, even when the cells show a red border, this event doesn't execute and I don't know why.
由实现 INotifyDataErrorInfo
接口的 class 明确引发 ErrorsChanged
事件
只要单元格显示红色边框,框架就不会引发它。例如,红色边框可能意味着甚至无法设置源 属性。例如,您不能将 T
类型的 属性 设置为 T
.
实例以外的任何其他值
我刚刚找到了一个可行的解决方案。就像我在@mm8 的评论中提到的那样,我发现这段代码:
Validator.ErrorsChanged += (s, e) => OnErrorsChanged(e);
在我的构造函数中,从未被调用,因为通过使用 e.NewItems[0] is ServiceHost newServiceHost
检查我的运行时类型,我没有创建新实例,因此没有调用构造函数。我尝试将该部分移到构造函数外部和 ValidateAllProperties
方法内部,现在工作正常。
在我的例子中,在我从 MainWindow VM 订阅 ErrorsChanged 属性 后立即调用此方法。
newServiceHost.ErrorsChanged += (o, args) => UpdateAllErrors();
如果您有任何假设或更好的想法,请告诉我。
我的 VM 中有一个完整的属性:
public ObservableCollection<ServiceHost> ServiceHosts
{
get => serviceHosts;
set
{
if (serviceHosts == value) { return; }
serviceHosts = value;
OnPropertyChanged();
}
}
在我的 MainWindow 的另一个 ViewModel 中,我在 ServiceHosts 属性 上使用 CollectionChanged
事件来获取添加的项目,将其转换为我期望的类型并收听 ErrorsChanged
属于该类型的 属性 事件。
看起来像这样:
ServiceHostViewModel.ServiceHosts.CollectionChanged += ServiceHostsOnCollectionChanged;
private void ServiceHostsOnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.Action == NotifyCollectionChangedAction.Add)
{
if (e.NewItems[0] is ServiceHost newItems)
{
newItems.Validator = new ServiceHostValidator();
newItems.ErrorsChanged += (o, args) => UpdateAllErrors();
newServiceHost.ValidateAllProperties();
}
}
}
不幸的是,ErrorsChanged
事件从未触发 UpdateAllErrors
方法,即使单元格显示红色边框,此事件也不会执行,我不知道为什么。
这是一个工作示例,我也使用 ErrorsChanged
事件,但在这里我将数据从代码添加到 ServiceHosts
而不是 UI:
private void SetErrorsChangedEventToAllServiceHosts(XmlParserBase xmlParserBase)
{
foreach (var serviceHost in xmlParserBase.GetServiceHostClients(new ServiceHostValidator()))
{
ServiceHostViewModel.ServiceHosts.Add(serviceHost);
serviceHost.ErrorsChanged += (sender, args) => UpdateAllErrors();
}
}
为什么 ServiceHostsOnCollectionChanged
中的 ErrorsChanged 事件不起作用?
感谢您的帮助。
评论更新: 这是我模型中的一些代码 class
public class ServiceHost : INotifyDataErrorInfo
{
public IValidator<ServiceHost> Validator;
public ServiceHost(IValidator<ServiceHost> validator)
{
this.Validator = validator;
this.Validator.ErrorsChanged += (s, e) => OnErrorsChanged(e);
}
}
Unfortunately the ErrorsChanged event never triggers the UpdateAllErrors method, even when the cells show a red border, this event doesn't execute and I don't know why.
由实现 INotifyDataErrorInfo
接口的 class 明确引发 ErrorsChanged
事件
只要单元格显示红色边框,框架就不会引发它。例如,红色边框可能意味着甚至无法设置源 属性。例如,您不能将 T
类型的 属性 设置为 T
.
我刚刚找到了一个可行的解决方案。就像我在@mm8 的评论中提到的那样,我发现这段代码:
Validator.ErrorsChanged += (s, e) => OnErrorsChanged(e);
在我的构造函数中,从未被调用,因为通过使用 e.NewItems[0] is ServiceHost newServiceHost
检查我的运行时类型,我没有创建新实例,因此没有调用构造函数。我尝试将该部分移到构造函数外部和 ValidateAllProperties
方法内部,现在工作正常。
在我的例子中,在我从 MainWindow VM 订阅 ErrorsChanged 属性 后立即调用此方法。
newServiceHost.ErrorsChanged += (o, args) => UpdateAllErrors();
如果您有任何假设或更好的想法,请告诉我。