0

许多示例(甚至来自 MS)使用调度程序来更新数据绑定属性,并且可以找到一堆不同的答案。是否存在“官方”声明?目前,我总是使用调度程序,并且只有在我确定这是一个官方功能并且它仍然适用于未来的 .Net 版本时,我才会更改它。

4

2 回答 2

0

是否需要调度程序来更改 WPF .Net Core 3 或更高版本中的数据绑定属性?

不需要。早期版本和 .NET Framework 版本也不需要它。

{Binding}对于通过正常数据绑定机制(例如XAML 中的标记)绑定到依赖项属性的任何属性,WPF 始终根据需要自动将属性更改更新编组到 UI 线程。

我不知道这是明确记录的。我在 Microsoft Docs 站点上查看了最有可能的主题,例如INotifyPropertyChangedWPF 的数据绑定和页面,但没有看到任何内容。然而,它是 WPF 的一个众所周知的特性,并在 MSDN 的这篇 2014 年文章中提到:MVVM:MVVM 应用程序中的多线程和调度

…WPF 自动将 PropertyChanged 事件分派到主线程…

另请参见例如任务并行库 INotifyPropertyChanged 未引发异常?

请注意,这仅适用于简单的单值属性。集合是另一回事,尽管自 4.5 以来的 WPF 还包括对集合更改事件的自动封送处理的一些支持。请参阅例如如何通过工作线程更新 ObservableCollection?

于 2020-04-02T00:14:13.007 回答
0

我不相信官方声明存在。但是,它通常似乎取决于您正在执行的更新类型。如果您正在更新 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");
    }
}
于 2020-04-01T14:31:31.920 回答