Обновить привязку статического свойства - PullRequest
6 голосов
/ 17 июня 2011

Приложение разработано на C # и WPF.У меня есть привязка данных к статическому свойству нестатического класса.Когда приложение запускается, привязка работает хорошо, но если я изменяю bool привязки, представление не обновляется.Как я могу обновить привязку этого статического свойства?NotifyChanged-Events не затрагиваются.

Класс:

public class ViewTemplateManager : NotifyBase
{
    public static bool CanResizeColumns { get; set; }

    static ViewTemplateManager()
    {
        CanResizeColumns = true;
    }

Представление:

<Thumb x:Name="PART_HeaderGripper" IsEnabled="{Binding Source={x:Static Member=viewManager:ViewTemplateManager.CanResizeColumns}}"

Ответы [ 4 ]

6 голосов
/ 17 июня 2011

Единственный способ сделать это, если у вас есть ссылка на связанный BindingExpression .

Если в вашем коде есть ссылка на большой палец, она будет выглядеть следующим образом:

var bindingExpression = thumb.GetBindingExpression(Thumb.IsEnabledProperty);
if (bindingExpression != null)
    bindingExpression.UpdateTarget();

Лучше всего было бы использовать шаблон синглтона, например:

public class ViewTemplateManager : NotifyBase
{
    public bool CanResizeColumns { get; set; }

    public static ViewTemplateManager Instance { get; private set; }

    static ViewTemplateManager()
    {
        Instance = new ViewTemplateManager();
    }

    private ViewTemplateManager()
    {
        CanResizeColumns = true;
    }
}

Тогда свяжись так:

<Thumb x:Name="PART_HeaderGripper" IsEnabled="{Binding Source={x:Static viewManager:ViewTemplateManager.Instance}, Path=CanResizeColumns}}"

Тогда вам просто нужно вызвать событие INotifyPropertyChanged.PropertyChanged при изменении CanResizeColumns.

2 голосов
/ 17 июня 2011

Вы можете реализовать свойства, используя Singleton , для которого свойство не является статическим, или вы просто делаете его нестатичным, но вы просто создаете один экземпляр в экземпляре App, например ( пошел бы с последним). В любом случае вы можете снова реализовать INotifyPropertyChanged.

2 голосов
/ 17 июня 2011

К сожалению, нет никакого прямого эквивалента механизму уведомления INotifyPropertyChanged для статического свойства.

Существует несколько параметров, в том числе:

  1. Создание экземплярасвойство уровня, которое возвращает статический член.Используйте пользовательский механизм для уведомления экземпляров об изменении, в это время экземпляр может вызвать событие PropertyChanged.Это может стать уродливым и привести к утечкам памяти, если вы не будете осторожны с отказом от подписки или использованием шаблона Weak Event.
  2. Переместите статическое свойство в singleton и поместите его в качестве члена экземпляра в экземпляр singleton.Это позволяет этому экземпляру вызывать PropertyChanged события как обычно.
0 голосов
/ 20 января 2014

Я думаю, что это более простое решение:

Свойство класса:

private static bool isEnabled; //there is Your static

public bool IsEnabled
{
    get { return isEnabled; }
    set
    {
        isEnabled = value;
        RaisePropertyChanged("IsEnabled"); //OnPropertyChanged or something
    }
}

XAML:

<Button IsEnabled="{Binding IsEnabled}"/>
...