Привязка объекта к текстовым полям окна в WPF - PullRequest
2 голосов
/ 22 июня 2011

У меня есть класс с именем Data с некоторыми открытыми членами: Name, Age, Address.

У меня также есть окно с текстовыми полями Name, Age, Address.

Объект Data может измениться в любое время.

Как я могу привязать объект Data к текстовым полям и следить за изменениями объекта?

Я знаю, что есть INotifyPropertyChanged и "свойства-зависимости", но я не знаю, как их использовать.

Редактировать

public class MyData : INotifyPropertyChanged
{
  private string _name;

  public string Name
  {
    get
    {
      return _name;
    }
    set
    {
      if (_name != value)
      {
        _name = value;
        OnPropertyChnged("Name");
      }
    }
   }
   public event PropertyChangedEventHandler PropertyChanged;

   protected void OnPropertyChanged(string name)
   {
     ProppertyChangedEventHandler handler = PropertyChanged;
     if (handler != null) handler(this, new PropertyChangedEventArgs(name));
   }
}

XAML код:

xmlns:myApp="clr-namespace:MyApp"
<Window.Resources><myApp:MyData x:key = data/></WindowResources>
<TextBox><TextBox.Text><Binding Source="{StaticResource data}" Path="Name" UpdateSourceTrigger="PropertyChanged"/></TextBox.Text></TextBox>

class OtherClass
{
  private MyData data;
  //the window that have the binding textbox
  private MyWindow window;
  public OtherClass()
  {
    data = new MyData();
    data.Name = "new name"
    window = new MyWindow();
    window.show();
  }
}

Ответы [ 2 ]

4 голосов
/ 22 июня 2011

Эта ссылка от MSDN это хорошо объясняет.

Ссылка MSDN не работает, добавлена ​​ссылка на аналогичную статью .

Когда свойство вашего класса изменяется, ваше свойство должно вызывать событие OnPropertyChanged с именем свойства, чтобы представление могло обновить его привязку.

    public String Name
    {
        get { return _name; }
        set 
        {
            if (_name != value)
            {
                _name = value;
                this.OnPropertyChanged("Name");
            }
        }
    }

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

<TextBox Text="{Binding Name}"/>

У меня есть класс ViewModelBase, где я реализовал свой OnPropertyChandedEvent для вызова всех производных моделей:

    /// <summary>
    /// An event for when a property has changed.
    /// </summary>
    public event PropertyChangedEventHandler PropertyChanged;

    /// <summary>
    /// Virtual method to call the Property Changed method
    /// </summary>
    /// <param name="propertyName">The name of the property which has changed.</param>
    protected virtual void OnPropertyChanged(String propertyName)
    {
        if (this.PropertyChanged != null)
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
0 голосов
/ 22 июня 2011

Давайте реализуем класс Data INotifyPropertyChanged .Вызывайте событие, когда кто-то изменяет значение свойства в экземплярах данных.Затем установите соответствующий DataContext для вашего пользовательского интерфейса и привяжите один элемент пользовательского интерфейса, например:

<TextBox Text="{Binding Age}"/>
...