不会引发 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();

如果您有任何假设或更好的想法,请告诉我。