Как сделать универсальный все еще наблюдаемым при использовании неявного оператора (или есть лучший способ)? - PullRequest
0 голосов
/ 22 мая 2019

Я создал универсальный наблюдаемый класс-обертку, чтобы я мог просто обернуть любой объект, чтобы сделать его наблюдаемым (гораздо лучше, чем злоупотребление observablecollection, я думаю).Это прекрасно работает, но я должен использовать Thing.Value = newValue, а не просто Thing = newValue.Я добавил неявные операторы, которые, кажется, заставляют последние частично работать, при использовании Thing = newValue он получает правильное значение, но привязка элемента GUI к нему не обновляется.Я думаю, что он либо не уведомляет, ни теряет учетную запись подписчика, возможно, потому что это новый объект, но не уверен.Возможно, неявный оператор должен возвращать тот же объект после установки значения, но я еще не выяснил, как ссылаться на него.

Как мне сделать, чтобы Thing = newValue все еще можно было наблюдать?
Редактировать:скопируйте пример из блока кода здесь для ясности.
Как я могу получить StatusVisibility = Visibility. Видимо, чтобы его можно было наблюдать?Моя цель - не добавлять .Value каждый раз, когда я присваиваю значение наблюдаемой.

    public class Observable<T> : INotifyPropertyChanged
    {
        public Observable(T value = default(T))
        {
            Value = value;
        }
        public event PropertyChangedEventHandler PropertyChanged;
        private T value;
        public T Value
        {
            get
            {
                return value;
            }
            set
            {
                this.value = value;
                NotifyPropertyChanged();
            }
        }
        private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
        public static implicit operator Observable<T>(T value)
        {
            return new Observable<T>(value);
        }
        public static implicit operator T(Observable<T> value)
        {
            return (T)value;
        }
    }
    public partial class MainWindow : Window
    {
        //WPF GUI element binds to this
        public static Observable<Visibility> StatusVisibility { get; set; }
            = new Observable<Visibility> { Value = Visibility.Hidden };
        //GUI updates when this is called
        StatusVisibility.Value = Visibility.Visible;
        //GUI element does not update when this is called
        StatusVisibility = Visibility.Visible;
    }
...