Унаследовать INotifyPropertyChanged для статического события из абстрактного класса - PullRequest
1 голос
/ 25 апреля 2019

Я пытаюсь реализовать несколько слоев абстракции для различных частей оборудования, и я обнаружил, что реализовал одну и ту же функцию, NofityStaticPropertyChanged (из здесь ) примерно 5 раз.

    /// <summary>
    /// A slightly different implementation of Static Property Changed, from here:
    /// https://stackoverflow.com/a/42111290/2444435
    /// </summary>
    public static event PropertyChangedEventHandler StaticPropertyChanged;

    protected static void NotifyStaticPropertyChanged(string propertyName)
    {
        StaticPropertyChanged?.Invoke(null, new PropertyChangedEventArgs(propertyName));
    }

Я бы хотел, чтобы все эти классы наследовали от abstract class AbstractionBase, чтобы избежать повторного использования кода.

Я читал в другом месте о том, как наследовать такого рода функции для нестатических членов, но на самом деле я никогда не создаю экземпляры этих слоев / фабрик абстракции.

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

public abstract class AbstractionBase : INotifyPropertyChanged
{
    //THIS IS NOT WORKING!
    #region INofity Declarations
    /// <summary>
    /// A slightly different implementation of Static Property Changed, from here:
    /// https://stackoverflow.com/a/42111290/2444435
    /// </summary>
    public static event PropertyChangedEventHandler StaticPropertyChanged;

    protected static void NotifyStaticPropertyChanged(string propertyName)
    {
        StaticPropertyChanged?.Invoke(null, new PropertyChangedEventArgs(propertyName));
    }

    #endregion
} 

Спасибо! У меня есть ощущение, что я не смогу сойти с рук с этой попыткой дедупликации, но если это возможно, то это будет изящно!

1 Ответ

1 голос
/ 25 апреля 2019

WPF 4.5 поддерживает привязку к статическим свойствам, все, что вам нужно сделать, это создать обработчик статических событий с тем же именем с добавленным текстом «Изменено», и вы вызываете его вместо вашего StaticPropertyChanged:

public class MyStaticClass
{
    public static event EventHandler MyStaticPropertyChanged;

    private static string _MyStaticProperty = "Hello World!";
    public static string MyStaticProperty
    {
        get { return _MyStaticProperty; }
        set
        {
            if (_MyStaticProperty != value)
            {
                _MyStaticProperty = value;
                MyStaticPropertyChanged?.Invoke(null, EventArgs.Empty);
            }
        }
    }
}

Что бы вы хотели связать, как это:

<TextBlock Text="{Binding Path=(vm:MyStaticClass.MyStaticProperty), Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />

Честно говоря, для меня это выглядит как архитектурная проблема. Если вы используете инфраструктуру внедрения зависимостей ... и вы должны это делать ... тогда абсолютно не нужно использовать статические свойства для чего-либо, просто поместите их в их собственный класс и настройте свой DI, чтобы сделать его одиночным.

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