Моя цель - создать синглет с общими данными, настройками и т. Д. Моего приложения. Я хочу, чтобы он был синглетоном для всего моего приложения, и чтобы он имел возможность двустороннего связывания в WPF с использованием INotify.
Я читал, что .net 4.5 может использовать StaticPropertyChanged
, поэтому мне интересно, как я бы реализовал это ниже, поскольку документация для этого кажется пятнистой.
public static class Global
{
public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged;
private static void CallPropChanged(string Prop)
{
StaticPropertyChanged?.Invoke(Settings, new PropertyChangedEventArgs(Prop));
}
private static Store Settings = new Store();
public static int setting1
{
get { return Settings._setting1; }
set { if (value != Settings._setting1) { Settings._setting1 = value; CallPropChanged("setting1"); } }
}
}
internal sealed class Store
{
internal int _setting1;
}
На правильном ли я пути к тому, чего хочу достичь?
Изменить: внесены некоторые изменения:
public sealed class Global:INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
static readonly Global _instance = new Global();
private int _setting1;
private int _setting2;
private void CallPropChanged(string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private bool SetField<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
{
if (EqualityComparer<T>.Default.Equals(field, value)) return false;
field = value;
CallPropChanged(propertyName);
return true;
}
private Global() { }
public static int setting1
{
get { return _instance._setting1; }
set { _instance.SetField(ref _instance._setting1, value); }
}
public static int setting2
{
get { return _instance._setting2; }
set { _instance.SetField(ref _instance._setting2, value); }
}
}
INotifyPropertyChanged
как обычно. Уточните вопрос, чтобы было понятно, с чем на самом деле у вас проблемы. Убедитесь, что вы включили хороший минимально воспроизводимый пример, который надежно воспроизводит любую проблему, с которой вы столкнулись. - person Peter Duniho   schedule 04.10.2016public static
, которое возвращает single экземпляр вашего класса, но сам класс и все его члены по-прежнему нестатичны. Затем вы можете реализовать интерфейсы (например,INPC
). Вы можете вместо использоватьStaticPropertyChanged
, но это не синглтон. Это просто статический класс, с которым может справиться WPF. См., Например, этот ответ для получения дополнительной информации. - person Peter Duniho   schedule 04.10.2016PropertyChanged
является общедоступным, нет общедоступного экземпляра объекта, к которому можно было бы привязаться. Я не понимаю, какова ваша фиксация на вопросе синглтона; Если для ваших нужд достаточно общедоступных статических свойств, почему шаблон singleton вообще обсуждается? Итог: я до сих пор не совсем понимаю, о чем вы здесь спрашиваете. Академический не по теме, поскольку он, как правило, в основном основан на мнении. Хороший вопрос для Stack Overflow связан с конкретной проблемой, которую нужно решить. - person Peter Duniho   schedule 05.10.2016PropertyChanged
, на которое WPF может подписаться, поэтому, хотя вы можете обнаружить, что привязка работает, когда свойства установлены до создания привязки, она не будет динамической. Т.е. изменения свойств не будут отражены в цели привязки. - person Peter Duniho   schedule 05.10.2016PropertyChanged
, вы смотрите на код, который я добавил выше, или на что-то еще? - person Wobbles   schedule 06.10.2016