Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 未引发集合更改事件中更改的错误_C#_Wpf_Datagrid_Inotifycollectionchanged - Fatal编程技术网

C# 未引发集合更改事件中更改的错误

C# 未引发集合更改事件中更改的错误,c#,wpf,datagrid,inotifycollectionchanged,C#,Wpf,Datagrid,Inotifycollectionchanged,我的虚拟机中有这样一个fullproperty: public ObservableCollection<ServiceHost> ServiceHosts { get => serviceHosts; set { if (serviceHosts == value) { return; } serviceHosts = value; OnPropertyChanged(); } } 不幸的是,E

我的虚拟机中有这样一个fullproperty:

public ObservableCollection<ServiceHost> ServiceHosts
{
    get => serviceHosts;
    set
    {
        if (serviceHosts == value) { return; }
        serviceHosts = value;
        OnPropertyChanged();
    }
}
不幸的是,
ErrorsChanged
事件从未触发
updatealErrors
方法,即使单元格显示红色边框,该事件也不会执行,我也不知道原因。
下面是一个工作示例,其中我还使用了
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);
    }
}
公共类服务主机:INotifyDataErrorInfo
{
公共IValidator验证器;
公共服务主机(IValidator验证程序)
{
this.Validator=Validator;
this.Validator.ErrorsChanged+=(s,e)=>onerroschanged(e);
}
}
不幸的是,ErrorsChanged事件从未触发UpdateAllErrors方法,即使单元格显示红色边框,该事件也不会执行,我不知道为什么

由实现
INotifyDataErrorInfo
接口的类来显式引发
ErrorsChanged
事件


当单元格显示红色边框时,框架不会引发它。例如,红色边框可能意味着甚至无法设置源属性。例如,您不能将类型为
T
的属性设置为
T
的实例以外的任何其他值。我刚刚找到了一个有效的解决方案。正如我在@mm8的评论中提到的,我发现以下代码:

Validator.ErrorsChanged += (s, e) => OnErrorsChanged(e);
它在我的构造函数中,从未被调用,因为通过使用
e.NewItems[0]是ServiceHost newServiceHost
来检查我的运行时类型,我没有创建新实例,因此没有调用构造函数。我尝试将该部分移到构造函数外部和
ValidateAllProperties
方法内部,现在效果很好

在我的例子中,在我从MainWindow VM订阅ErrorsChanged属性之后,会立即调用此方法

newServiceHost.ErrorsChanged += (o, args) => UpdateAllErrors();

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

您是否在某处提出了
错误更改
?好的,您告诉了我问题可能是什么。我的模型类
ServiceHost
正在构造函数中引发
ErrorsChanged
事件。当我将第一个代码与工作代码进行比较时,我发现在工作示例中,我创建了一个新对象,因此调用了我的构造函数,而在第一个代码中,我只是将其转换为该类型的对象。这可能是个问题吗?我将发布我提到的代码。这可能是个问题吗?好的,是的,如果不引发事件,处理程序将永远不会被调用。好的,我在注释中提到的问题中添加了一些代码。如果这是问题所在,我如何更改
e.NewItems[0]是ServiceHost newServiceHost
这部分代码以调用构造函数并订阅该事件?或者我可以将事件处理程序放置在其他什么位置?每当出现错误时,事件都应该得到提升。我不知道你为什么要在构造器中提出它。如果您想在创建/添加对象时更新状态,为什么不直接调用
updatealErrors
,而不是等待从未引发的事件?当我直接调用方法时,就像您提到的,它只被调用一次。但我想在每次错误改变时调用它。。我只是看了一眼,好像我认为问题在于,通过这个调用
e.NewItems[0]是ServiceHost newServiceHost
,我没有使用构造函数,因此没有将其子循环到内部的事件。正如我在上面所问的,是否有可能使用
e.NewItems[0]
调用构造函数?
newServiceHost.ErrorsChanged += (o, args) => UpdateAllErrors();