2015-10-11 3 views
-2

Я пытаюсь добавить свойства к моей модели, играя с моим первым MVVM-приложением. Теперь я хочу добавить место для сохранения конкретных данных в чистом виде, поэтому я использовал структуру. Но у меня возникают проблемы с уведомлением об изменении свойства, у него нет доступа к методу (Ссылка на объект требуется для нестатического поля) Может кто-нибудь объяснить мне, почему это происходит, и сообщить мне о стратегии, которая соответствует моей потребности?structs и INotifyPropertyChanged

Спасибо!

public ObservableCollection<UserControl> TimerBars 
{ 
    get { return _TimerBars; } 
    set 
    { 
     _TimerBars = value; 
     OnPropertyChanged("TimerBars"); 
    } 
} 

public struct FBarWidth 
{ 
    private int _Stopped; 
    public int Stopped 
    { 
     get { return _Stopped; } 
     set 
     { 
      _Stopped = value; 
      OnPropertyChanged("Name"); //ERROR: An object reference is required for the non-static field 
     } 
    } 

    private int _Running; 
    //And more variables 
} 


private void OnPropertyChanged(string propertyName) 
{ 
    PropertyChangedEventHandler handler = PropertyChanged; 
    if (handler != null) 
    { 
     handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 
public event PropertyChangedEventHandler PropertyChanged; 
+0

'FBarWidth' не реализует никаких INotifyPropertyChanged и метод OnPropertyChanged не определен в этой области структуры. Разве вы даже не видите этого? Это очень простое понимание C#. –

+0

Ну все это внутри класса, который реализует INotifyPropertyChanged. И все, что работает с регулярными переменными, но когда я хочу использовать структуру для определения «сгруппированных» переменных, я не могу заставить ее работать. И да, я совершенно новичок в этом .. – Unhek

+0

На основании вашего последнего комментария; Посмотрите мой обновленный ответ ниже. – Mathias

ответ

1

OnPropertyChanged необходимо указать в области, к которой вы хотите обновить свойства.

Для этого вам необходимо реализовать интерфейс INotifyPropertyChanged.

И, наконец, вы должны предоставить правильный аргумент методу OnPropertyChanged. В этом примере «Остановлено»

public struct FBarWidth : INotifyPropertyChanged 
{ 
    private int _Stopped; 
    public int Stopped 
    { 
     get { return _Stopped; } 
     set 
     { 
      _Stopped = value; 
      OnPropertyChanged("Stopped"); 
     } 
    } 

    private int _Running; 
    //And more variables 

    private void OnPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 
} 

Edit: В вашем комментарии вы упомянули, что у вас есть класс sorounding код вы предоставили в вашем примере.

Это означает, что вы вложили структуру внутри класса. Просто потому, что вы вложили свою структуру, не означает, что она наследует свойства и методы из внешнего класса. Вам еще нужно реализовать INotifyPropertyChanged внутри вашей структуры и определить внутри него метод OnPropertyChanged.

+0

Так что мне нужно реализовать интерфейс для INotifyPropertyChanged дважды, внутри структуры? – Unhek

+0

Вам необходимо реализовать интерфейс в структуре со свойствами, которые необходимо обновить. В приведенном выше примере вы этого не сделали. – Mathias

+0

Хорошо, спасибо большое, поэтому я предполагаю, что здесь нет лучшей стратегии, чем просто дублировать реализацию там, где это необходимо? – Unhek

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