如何解决未引发 Collection Changed 事件中的 Errors Changed
我的 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
事件,但在这里我将数据从代码而不是 UI 添加到 ServiceHosts
:
private void SetErrorsChangedEventToAllServiceHosts(XmlParserBase xmlParserBase)
{
foreach (var serviceHost in xmlParserBase.GetServiceHostClients(new ServiceHostValidator()))
{
ServiceHostviewmodel.ServiceHosts.Add(serviceHost);
serviceHost.ErrorsChanged += (sender,args) => UpdateallErrors();
}
}
为什么 ServiceHostsOnCollectionChanged
中的 ErrorsChanged 事件不起作用?
任何帮助表示赞赏。
public class ServiceHost : INotifyDataErrorInfo
{
public IValidator<ServiceHost> Validator;
public ServiceHost(IValidator<ServiceHost> validator)
{
this.Validator = validator;
this.Validator.ErrorsChanged += (s,e) => OnErrorsChanged(e);
}
}
解决方法
不幸的是,ErrorsChanged 事件从未触发 UpdateAllErrors 方法,即使单元格显示红色边框,此事件也不会执行,我不知道为什么。
由实现 INotifyDataErrorInfo
接口的类来显式引发 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();
如果您有任何假设或更好的想法,请告诉我。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。