Как привязать простое свойство .net к метке и сделать его автоматическим обновлением - PullRequest
3 голосов
/ 31 марта 2011

Я немного новичок в привязке данных и, очевидно, не совсем понимаю. Я пытаюсь привязать простое свойство .net к метке и обновлять эту метку при каждом изменении свойства. Это не работает, и я не уверен, в чем проблема.

Вот мой XAML

 <Label Content="{Binding Path=Name, UpdateSourceTrigger=PropertyChanged}"></Label>

 <Button Name="bChangeProperty" Click="bChangeProperty_Click">Change Property</Button>

Вот мой файл UserControl cs

public partial class MyUserControl : UserControl, INotifyPropertyChanged
{

   private MyObjectClass _myObject;
   public MyObjectClass MyProperty
   {
       get { return _myObject;}
       set
       {
          if (_myObject != value)
          {
              _myObject = value;
              OnPropertyChanged("MyProperty"); 
          }
        }
   }


   public MyUserControl(MyObjectClass obj)
   {
      if (obj == null)
      {
          obj = new MyObjectClass();
          obj.Name = "Frank";
      }
      MyProperty= obj;
      base.DataContext = MyProperty;
   }

   //INotifyPropertyChanged stuff
   public event PropertyChangedEventHandler PropertyChanged;
   private void OnPropertyChanged(string propertyName)
   {
      //PropertyChanged is always null, don't really understand this part
      if (PropertyChanged != null)
         PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
   }


   private void bChangeProperty_Click(object sender, RoutedEventArgs e)
   {
       //Create a new object, and set it to the MyProperty Property - which I thought
       //would update the label, but it doesn't
       MyObjectClass newObject = new MyObjectClass();
       newObject.Name = "Bob";

       MyProperty= newObject;
   }

Вот MyObjectClass

public class MyObjectClass
{
    public string Name {get; set;}
}

Начальная привязка работает, она устанавливает метку «Frank», но когда я нажимаю кнопку и объект изменяется, метка не обновляется. Это всего лишь пример чего-то вроде того, что я пытаюсь сделать.

Нужно ли где-то устанавливать PropertyChanged? Я вроде думал, что именно это и должно было делать XAML, но, видя, что он всегда нулевой, по-видимому, это не так.

Ответы [ 2 ]

5 голосов
/ 31 марта 2011

Вам нужно реализовать INotifyPropertyChanged на MyObjectClass и запустить PropertyChanged после изменения MyObjectClass.Name.

public class MyObjectClass : INotifyPropertyChanged
{
    private string name;

    public string Name 
    {
        get
        {
            return this.name;
        }
        set
        {
            this.name = value;
            OnPropertyChanged("Name"); 
        } 
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {      
       if (PropertyChanged != null)
          PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}
3 голосов
/ 31 марта 2011

Вы устанавливаете DataContext в своем конструкторе так, чтобы он указывал на исходный объект "Frank", но когда вы изменяете экземпляр, на который указывает MyProperty, вы не обновляете DataContext соответственно.

Следовательно, прямое решение состоит в том, чтобы добавить это:

private void bChangeProperty_Click(object sender, RoutedEventArgs e)
{
   //Create a new object, and set it to the MyProperty Property - which I thought
   //would update the label, but it doesn't
   MyObjectClass newObject = new MyObjectClass();
   newObject.Name = "Bob";

   MyProperty= newObject;
   this.DataContext = MyProperty; // ADD THIS LINE
}

Однако, правильное решение состоит в том, чтобы вообще не устанавливать DataContext и просто изменить Binding:

<Label Content="{Binding Path=MyProperty.Name} ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...