2015-07-13 2 views
0

Мне интересно, как обновить мой UI с моим static. У меня есть 2 свойства в моей модели и один из них static:PropertyChangedEventHandler для статической переменной, не изменяющейся

public class Machine : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    public static event PropertyChangedEventHandler StaticPropertyChanged; 
    public string _name; 
    public static int _counter; 

    public void AddMachine(Machine machine) 
    { 
     _counter++; 
    } 

    public string Name 
    { 
     get { return _name; } 
     set 
     { 
      _name = value; 
      NotifyPropertyChange("Name"); 
     } 
    } 

    public static int Counter 
    { 
     get { return _counter; } 
     set 
     { 
      _counter = value; 
      OnStaticlPropertyChanged("Counter"); 
     } 
    } 

    public virtual void NotifyPropertyChange(string propertyName) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    public static void OnStaticlPropertyChanged(string propertyName) 
    { 
     var handler = StaticPropertyChanged; 
     if (handler != null) 
      StaticPropertyChanged(
       typeof(Machine), 
       new PropertyChangedEventArgs(propertyName)); 
    } 
} 

Как вы можете видеть, я создал еще один PropertyChangedEventHandler для моего static значения. Другое свойство (не статическое - имя) работает нормально. Я держу свой объект в коллекции:

public ObservableCollection<Machine> machines { get; set; } 

И я могу видеть Counter меняется, но не обновляет свой UI, это то, как я пытаюсь обновить мой UI используя TextBlock:

<TextBlock Name="tbStatusBar" Text="{Binding Source={x:Static my:Machine.Counter}}" /> 

Итак, мой вопрос в том, что я делаю неправильно?

+1

Возможно, вы должны заменить '_counter ++' на 'Counter ++' в AddMachine. – Clemens

+0

Я уже пробовал, и это не проблема – user979033

+0

Вы действительно используете WPF 4.5? Механизм событий StaticPropertyChanged не будет работать со старой версией. – Clemens

ответ

0

Во-первых, вы должны убедиться, что используете WPF 4.5, поскольку механизм событий StaticPropertyChanged не будет работать со старой версией.

Затем в AddMachine, вы должны обновить свойство, а не его поддержка поле:

public void AddMachine(Machine machine) 
{ 
    Counter++; 
} 

Наконец, вы должны изменить выражение привязки от статического источника на пути к статическому свойству (обратите внимание, скобки):

<TextBlock Text="{Binding Path=(my:Machine.Counter)}" /> 
+0

ОК, теперь это работает, но у меня есть еще одна моя статическая переменная, я получаю доступ из разных потоков, поэтому каждый раз, когда я обновил это поле, я делаю так: Interlocked.Increment (ref _counter); так что теперь это даже не компилируется с помощью Counter вместо _counter, поэтому я изменяю это на Counter ++, и в определении этого поля я добавил volatile, теперь все в порядке? – user979033

+0

Не знаю. Это другой вопрос, я думаю. – Clemens

Смежные вопросы