GetValue и SetValue против INotifyPropertyChanged.PropertyChanged при создании BindableProprties? - PullRequest
0 голосов
/ 28 января 2019

Я обычно расширяю элементы управления, создавая привязываемые свойства, в этой форме:

  public static readonly BindableProperty OnTextProperty = BindableProperty.Create(nameof(OnText),
            typeof(string), typeof(TextSwitch), defaultValue: string.Empty, defaultBindingMode: BindingMode.TwoWay,
            propertyChanged: HandleOnTextPropertyChanged);

        private static void HandleOnTextPropertyChanged(BindableObject bindable, object oldValue, object newValue)
        {
            (bindable as TextSwitch)?.Rebuild();
        }

        public string OnText
        {
            get { return (string)GetValue(OnTextProperty); }
            set { SetValue(OnTextProperty, value); }
        }

для меня, поскольку я сделал несколько WPF, привязываемые свойства состоят из двух частей: статического поля BindableProperty только для чтения и соответствующегосвойство с GetValue в получателе и SetValue в установщике.Но я наткнулся на это: https://github.com/adamped/NavigationMenu/blob/master/NavigationMenu/NavigationMenu/NavigationItem.xaml.cs

, который просто запускает событие PropertyChanged:

public static readonly BindableProperty TextProperty = BindableProperty.Create(
    nameof(Text),
    typeof(string),
    typeof(NavigationItem),
    string.Empty,
    propertyChanging: (bindable, oldValue, newValue) =>
    {
        var ctrl = (NavigationItem)bindable;
        ctrl.Text = (string)newValue;
    },
    defaultBindingMode: BindingMode.OneWay);

private string _text;

public string Text
{
    get { return _text; }
    set
    {
        _text = value;
        OnPropertyChanged();
    }
}

Как это можно объединить с привязываемыми свойствами, чтобы заставить его работать без GetValue иSetValue ?, и в каких случаях нам нужно использовать один подход над другим?

РЕДАКТИРОВАТЬ

Очевидно, я не привык к понятию самосвязывающего многоразового управления ... но нене звоните GetValue и SetValue, необходимые для свойств привязки?

1 Ответ

0 голосов
/ 29 января 2019

Эти две реализации одинаковы.

GetValue(BindableProperty) и SetValue используются для доступа к значениям свойств, которые реализуются с помощью BindableProperty.То есть разработчики приложений обычно предоставляют интерфейс для связанного свойства, определяя открытое свойство, метод доступа get которого преобразует результат GetValue(BindableProperty) в соответствующий тип и возвращает его, а метод доступа set использует SetValue для установки значения на правильное значение.имущество.

Ваше достижение

private static void HandleOnTextPropertyChanged(BindableObject bindable, object oldValue, object newValue)
    {
        (bindable as TextSwitch)?.Rebuild();
    }

совпадает с

 propertyChanging: (bindable, oldValue, newValue) =>
{
    var ctrl = (NavigationItem)bindable;
    ctrl.Text = (string)newValue;
}

Используется OnPropertyChanged ();в setValue метод

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...