许多示例(甚至来自 MS)使用调度程序来更新数据绑定属性,并且可以找到一堆不同的答案。是否存在“官方”声明?目前,我总是使用调度程序,并且只有在我确定这是一个官方功能并且它仍然适用于未来的 .Net 版本时,我才会更改它。
2 回答
是否需要调度程序来更改 WPF .Net Core 3 或更高版本中的数据绑定属性?
不需要。早期版本和 .NET Framework 版本也不需要它。
{Binding}
对于通过正常数据绑定机制(例如XAML 中的标记)绑定到依赖项属性的任何属性,WPF 始终根据需要自动将属性更改更新编组到 UI 线程。
我不知道这是明确记录的。我在 Microsoft Docs 站点上查看了最有可能的主题,例如INotifyPropertyChanged
WPF 的数据绑定和页面,但没有看到任何内容。然而,它是 WPF 的一个众所周知的特性,并在 MSDN 的这篇 2014 年文章中提到:MVVM:MVVM 应用程序中的多线程和调度:
…WPF 自动将 PropertyChanged 事件分派到主线程…
另请参见例如任务并行库 INotifyPropertyChanged 未引发异常?
请注意,这仅适用于简单的单值属性。集合是另一回事,尽管自 4.5 以来的 WPF 还包括对集合更改事件的自动封送处理的一些支持。请参阅例如如何通过工作线程更新 ObservableCollection?
我不相信官方声明存在。但是,它通常似乎取决于您正在执行的更新类型。如果您正在更新 VM 上的普通属性,那么没关系,如果您正在更新依赖项属性,那么它就可以了。如果您要从列表中添加或删除,那么没关系,如果您要从可观察的集合中添加或删除,那么它就可以了。
一般来说,我会说避免 VM 中的依赖属性并使用 INotifyPropertyChanged,将它们留给您的 UserControls。那么你就不必担心它们了。将像 DoPropertyChanged(propertyname) 这样的方法添加到 VM 的基类中,这样您就可以创建像 VB.net 这样的属性片段
Private _MajorChange As String
Public Property MajorChange As String
Get
Return _MajorChange
End Get
Set(value As String)
_MajorChange = value
DoPropertyChanged("MajorChange")
End Set
End Property
C#
private string _MajorChange;
public string MajorChange
{
get
{
return _MajorChange;
}
set
{
_MajorChange = value;
DoPropertyChanged("MajorChange");
}
}
并快速将属性添加到您的虚拟机。
我们还大量使用索引属性并为此提供了一个片段。VB
Public Property PropertyName As String
Get
Return Me("ColumnName")
End Get
Set(value As String)
Me("ColumnName") = value
DoPropertyChanged("PropertyName")
End Set
End Property
C#
public string PropertyName
{
get
{
return <string>this("ColumnName");
}
set
{
this("ColumnName") = value;
DoPropertyChanged("PropertyName");
}
}