Как включить изменение свойства для привязки данных? - PullRequest
2 голосов
/ 20 сентября 2011

Предположим, у меня есть виртуальная машина, которая реализовала INotifyPropertyChange:

public class MyViewModel{
  public MyClass{get;set;}
  ...
}

но простой класс MyClass не реализован INotifyPropertyChange, он содержит только некоторые свойства, такие как:

public class MyClass
    {
        public MyClass()
        {
        }
        public string P1 { get; set; }
    ... 
    }

в xaml, DataContext - это MyViewModel. Я установил привязку как:

Text = "{Binding MyClass.P1}"

Затем в конструкторе MyViewModel я настроил экземпляр MyClass и изменил свойства огня, как

this.RaisePropertyChanged("MyClass");

но значение P1 не отображается в пользовательском интерфейсе. Как реализовать что-то вроде этого. В этом случае RaisePropertyChanged («MyClass.P1»)?

Ответы [ 4 ]

2 голосов
/ 20 сентября 2011

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

Если вы не можете заставить этот класс реализовать INotifyPropertyChanged, вы должны создать отдельный класс ViewModel, который обернет его и реализует INotifyPropertyChanged.

0 голосов
/ 20 сентября 2011

Добавьте свойство типа MyClass к вашей ViewModel.В установщике вашего свойства вы бы вызвали RaisePropertyChanged ().

Например,

    public MyClass SomeName
    {
        get
        {
            return this._SomeName;
        }
        set
        {
            if (value != this._SomeName)
            {
                this._SomeName = value;
                this.RaisePropertyChanged("SomeName");
            }
        }
    }

    private MyClass _SomeName;
0 голосов
/ 20 сентября 2011

У вас может быть событие с именем, следующим за этим шаблоном:

public event EventHandler <PropertyName>Changed;
public event EventHandler P1Changed;

Привязка будет автоматически определять событие P1Changed и использовать его для привязки данных.

Все, что вам нужно сделать, это вызвать событие P1Changed, когда это необходимо.

0 голосов
/ 20 сентября 2011

Нет способа сделать это.Лучшим вариантом будет либо обернуть это значение в ViewModel, что позволит вам вызвать событие PropertyChanged непосредственно в ViewModel.

Однако, если это не вариант по той или иной причине,другой вариант - вызвать:

this.RaisePropertyChanged(string.Empty);

Это обновит всех привязок в представлении, включая MyClass.P1.Однако это не всегда хорошее решение с точки зрения производительности, поскольку оно вызывает полное обновление привязки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...