Как я могу вызвать событие PropertyChanged из статического метода?

У меня есть следующий класс

public class LanguagingBindingSource : INotifyPropertyChanged
{
  public event PropertyChangedEventHandler PropertyChanged;

  public string Dummy
  {
    get { return String.Empty; }
    set
    {
      PropertyChanged(this, new PropertyChangedEventArgs("Dummy"));
    }
  }
}

который привязан к элементам в XAML, как это

Text="{Binding Dummy,Source={StaticResource languageSource},Converter={StaticResource languageConverter},ConverterParameter=labelColor}"

Единственная цель класса LanguageBindingSource и его метода Dummy — позволить уведомлениям о свойствах обновлять привязки при изменении одного или нескольких ресурсов. Фактические связанные значения предоставляются преобразователем, ищущим ресурсы по именам, переданным в качестве параметров. См. комментарии к этому ответу для получения дополнительной информации.

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


person Steve Crane    schedule 15.07.2010    source источник


Ответы (1)


Измените свой класс следующим образом: -

public class LanguagingBindingSource : INotifyPropertyChanged
{
  public event PropertyChangedEventHandler PropertyChanged = delegate {};

  public static void FirePropertyChanged(string key)
  {
     ((LanguagingBindingSource)Application.Resources[key]).NotifyPropertyChanged("Dummy");
  }

  private void NotifyPropertyChanged(string name)
  {
    PropertyChanged(this, new PropertyChangedEventArgs(name);
  }

  public string Dummy
  {
    get { return String.Empty; }
    set
    {
      NotifyPropertyChanged("Dummy"));
    }
  }
}

Теперь в любой точке, где вам нужно запустить это изменение, используйте: -

LanguagingBindingSource.FirePropertyChanged("languageBindingSource");

Где «languageBindingSource» — это ключ ресурса, который вы также используете в свойстве привязки Source.

person AnthonyWJones    schedule 15.07.2010
comment
Это не работает. Я получаю синтаксическую ошибку; Ссылка на объект требуется для нестатического поля, метода или свойства «System.Windows.Application.Resources.get». Кроме того, если я неправильно понимаю, метод FirePropertyChanged нужно будет вызывать из представления, реализующего привязки, а ресурсы должны находиться в словаре ресурсов приложения, что не так; имена ресурсов — это ключи, предоставляемые внешней библиотеке, которая ищет ресурсы в базе данных. - person Steve Crane; 15.07.2010
comment
Немного подробнее о сценарии; у меня есть приложение, состоящее из множества представлений (пользовательских элементов управления и т. д.), которые будут использовать этот механизм привязки. В одном из этих представлений есть кнопка, при нажатии которой открывается пользовательский интерфейс перевода (реализованный в сборке вне области моего приложения), в котором пользователь может предоставлять переводы для одного или нескольких ресурсов. Когда этот пользовательский интерфейс закрывается (он уведомляет меня), мне нужен механизм для запуска обновления всех привязок во всех представлениях. - person Steve Crane; 15.07.2010
comment
Я понятия не имею, какой из ресурсов мог измениться. - person Steve Crane; 15.07.2010