Нужен ли диспетчер для изменения привязанных к данным свойств в WPF. Net Core 3 или новее? - PullRequest
0 голосов
/ 01 апреля 2020

Многие примеры (даже из MS) используют диспетчер для обновления свойств, связанных с данными, и можно найти кучу разных ответов. Существует ли «официальное» заявление? В настоящее время я всегда использую диспетчер, и я изменил бы это, только если я уверен, что это официальная функция, и она все еще будет работать в будущих версиях. Net версии.

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Нужен ли диспетчер для изменения привязанных к данным свойств в WPF. Net Core 3 или новее?

Нет. Это не требуется ни в более ранних версиях, ни в. NET версиях Framework.

WPF всегда автоматически собирал обновления изменения свойств в потоке пользовательского интерфейса по мере необходимости для любых свойств, связанных со свойством зависимости через обычный механизмы привязки данных (например, {Binding} разметка в XAML).

Я не знаю, что это задокументировано явно. Я осмотрел сайт Microsoft Docs по наиболее вероятным темам, таким как привязка данных и страницы INotifyPropertyChanged для WPF, но ничего не увидел. Однако это хорошо известная функция WPF, о которой упоминается в статье 2014 года из MSDN: MVVM: многопоточность и диспетчеризация в приложениях MVVM :

… WPF автоматически отправляет Событие PropertyChanged для основного потока…

См. Также, например, Библиотека параллельных задач INotifyPropertyChanged НЕ выдает исключение?

Обратите внимание, что это только для простого однозначного значения свойства. Коллекции - это другое дело, хотя в WPF начиная с 4.5 также включена некоторая поддержка автоматического маршалинга событий, измененных коллекциями. См. Например Как обновить ObservableCollection через рабочий поток?

0 голосов
/ 01 апреля 2020

Я не верю, что официальное заявление существует. Однако обычно это зависит от типа обновления, которое вы делаете. Если вы обновляете обычное свойство на ВМ, то не имеет значения, если вы обновляете свойство зависимости, тогда это имеет значение. Если вы добавляете или удаляете из списка, то это не имеет значения, если вы добавляете или удаляете из наблюдаемой коллекции, то это делает.

Как правило, я бы сказал, избегайте свойств зависимости в ВМ и используйте INotifyPropertyChanged, оставьте их своим пользовательским элементам управления. Тогда вам не нужно беспокоиться о них. Добавьте метод типа DoPropertyChanged (propertyname) в базовый класс для своей виртуальной машины, чтобы затем можно было создать фрагмент свойства, например 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");
    }
}
...