C# 未引发集合更改事件中更改的错误
我的虚拟机中有这样一个fullproperty: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
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();