c# - 调用 PropertyChangedEventHandler 时出现 InvalidCastException
问题描述
情况:
- 为 UI 使用 MVVM 和 Xaml 的 UWP 应用
- 视图模型派生自
ModelBase
实现INotifyPropertyChanged
接口的类
问题:
- 当使用受影响的类执行特定的 UI 测试时,在某些情况下,应用程序会在调用
InvalidCastException
期间抛出一个。PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName))
使用已使用调试日志条目验证的 [CallerMemberName] 正确设置了 propertyName。该SetProperty
方法在 DependencyProperty 中使用支持字段调用。绑定到 PropertyChanged 事件的 Xaml 元素中使用的 DebugConverter 显示有效转换,但绑定元素的设置失败。看起来 Double to Double 演员是不可能的,这是没有意义的。
问题
- 有谁知道这个例外的原因可能是什么?
代码
控制.xaml
Maximum="{Binding TimeControlCanvasWidth, Converter={StaticResource DebugConverter}}" />
模型库.cs
public class ModelBase : INotifyPropertyChanged
{
/// <summary>
/// The event raised, when the property changed
/// </summary>
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName]string propertyName = null)
{
try
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
catch (System.InvalidCastException)
{
LogManager.Current.GetLogger(GetType()).LogCritical(() => $"#####{nameof(OnPropertyChanged)}" +
$" - InvalidCastException | propertyName={propertyName}");
}
}
protected virtual bool SetProperty<T>(ref T field, T value, [CallerMemberName]string propertyName = null)
{
if (field?.Equals(value) == true)
{
return false;
}
field = value;
// ReSharper disable once ExplicitCallerInfoArgument
OnPropertyChanged(propertyName);
return true;
}
}
}
视图模型.cs
public class TimeControlViewModel : ModelBase
{
private double _timeControlCanvasWidth;
public double TimeControlCanvasWidth
{
get => _timeControlCanvasWidth;
set
{
if (SetProperty(ref _timeControlCanvasWidth, value))
{
// do sth.
}
}
}
}
解决方案
推荐阅读
- java - 如何通过url获取分页中的所有数据
- python - 如何在scrapy中发出请求以避免硒中间件?
- postgresql - 当对 TABLE1 进行 SELECT 查询时,如何创建将 TABLE1 的值插入到 TABLE2 的规则
- php - 如何通过最佳实践将 OpenCart 设置到 Heroku
- c# - 每个 Grpc 一元调用的 C# 重用或创建新客户端
- ssis - 我们可以在 SSIS SMTP 邮件任务中进行用户名和密码验证吗?
- python - 为多个类创建图像数据集
- c# - 需要修改导航方法以使导航多于一个
- multithreading - 彼得森的进程调度解决方案
- ruby-on-rails - 如何根据评分将所有成员分成独立的公平团队?