INotifyPropertyChanged 上的 ComboBox 不会捕获任何 UnhandledException,而 Button 会
Any UnhandledException are not caught from ComboBox on INotifyPropertyChanged, while Button does
给定一个 WPF Core/Framework 应用程序。未处理的异常应该被某些 UnhandledException
事件捕获。
TaskScheduler.UnobservedTaskException += (s, e) => Debugger.Break();
AppDomain.CurrentDomain.UnhandledException += (sender, eventArgs) => Debugger.Break();
Dispatcher.UnhandledException += (sender, args) => Debugger.Break();
DispatcherUnhandledException += (sender, eventArgs) => Debugger.Break();
给出的是由组合框呈现的 ObservableCollection<TItem>
collection。
collection 也会触发 ItemPropertyChanged
事件。
Collection.CollectionChanged += ItemsCollectionChanged;
public event PropertyChangedEventHandler PropertyItemChanged = delegate { };
private void ItemsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.OldItems != null)
{
foreach (INotifyPropertyChanged item in e.OldItems)
item.PropertyChanged -= ItemPropertyChanged;
}
if (e.NewItems != null)
{
foreach (INotifyPropertyChanged item in e.NewItems)
item.PropertyChanged += ItemPropertyChanged;
}
}
问题是我没有实现
private void ItemPropertyChanged(object sender, PropertyChangedEventArgs e)
{
throw new NotImplementedException("ToDo");
// done later PropertyItemChanged(sender, e);
}
当我像这样从代码 behind/view 模型更改 collection 项目 属性 时
ComboBoxCatalog.Collection.First().IsChecked = true;
一切都很好。调试器在某些 UnhandledException
.
处停止
现在,当我通过组合框更改 属性 时:
<ComboBox ItemsSource="{Binding ComboBoxCatalog.Collection, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
<ComboBox.ItemTemplate>
<DataTemplate DataType="{x:Type local:CheckboxItem}">
<CheckBox Content="{Binding IsChecked}" IsChecked="{Binding IsChecked}" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
其中 None 个 UnhandledException
已被解雇。仅 FirstChanceException
被解雇。
我已经在 Github 上实现了完整的工作演示:https://github.com/LwServices/WpfAppExceptionDemo
需要做什么才能触发异常 UnhandledException
?
更新:我在 .NET Core 3.1 和 .NET Framework 4.7.2 上得到了相同的行为
异常被框架捕获并为您处理。
如果您在 Visual Studio 中调试时查看输出 window,您将看到调试器输出 System.Windows.Data Error
消息:
System.Windows.Data Error: 8 : Cannot save value from target back to source. ...
如果您想将此类错误转化为您可以在全局错误处理程序中捕获的运行时异常,您可以按照建议实现自己的 TraceListener
here。
给定一个 WPF Core/Framework 应用程序。未处理的异常应该被某些 UnhandledException
事件捕获。
TaskScheduler.UnobservedTaskException += (s, e) => Debugger.Break();
AppDomain.CurrentDomain.UnhandledException += (sender, eventArgs) => Debugger.Break();
Dispatcher.UnhandledException += (sender, args) => Debugger.Break();
DispatcherUnhandledException += (sender, eventArgs) => Debugger.Break();
给出的是由组合框呈现的 ObservableCollection<TItem>
collection。
collection 也会触发 ItemPropertyChanged
事件。
Collection.CollectionChanged += ItemsCollectionChanged;
public event PropertyChangedEventHandler PropertyItemChanged = delegate { };
private void ItemsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.OldItems != null)
{
foreach (INotifyPropertyChanged item in e.OldItems)
item.PropertyChanged -= ItemPropertyChanged;
}
if (e.NewItems != null)
{
foreach (INotifyPropertyChanged item in e.NewItems)
item.PropertyChanged += ItemPropertyChanged;
}
}
问题是我没有实现
private void ItemPropertyChanged(object sender, PropertyChangedEventArgs e)
{
throw new NotImplementedException("ToDo");
// done later PropertyItemChanged(sender, e);
}
当我像这样从代码 behind/view 模型更改 collection 项目 属性 时
ComboBoxCatalog.Collection.First().IsChecked = true;
一切都很好。调试器在某些 UnhandledException
.
现在,当我通过组合框更改 属性 时:
<ComboBox ItemsSource="{Binding ComboBoxCatalog.Collection, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
<ComboBox.ItemTemplate>
<DataTemplate DataType="{x:Type local:CheckboxItem}">
<CheckBox Content="{Binding IsChecked}" IsChecked="{Binding IsChecked}" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
其中 None 个 UnhandledException
已被解雇。仅 FirstChanceException
被解雇。
我已经在 Github 上实现了完整的工作演示:https://github.com/LwServices/WpfAppExceptionDemo
需要做什么才能触发异常 UnhandledException
?
更新:我在 .NET Core 3.1 和 .NET Framework 4.7.2 上得到了相同的行为
异常被框架捕获并为您处理。
如果您在 Visual Studio 中调试时查看输出 window,您将看到调试器输出 System.Windows.Data Error
消息:
System.Windows.Data Error: 8 : Cannot save value from target back to source. ...
如果您想将此类错误转化为您可以在全局错误处理程序中捕获的运行时异常,您可以按照建议实现自己的 TraceListener
here。