Страницы

Поиск по вопросам

четверг, 13 февраля 2020 г.

Wpf: привязка данных из объекта

#c_sharp #framework #wpf #net #binding


Есть отдельный класс Piple с кучей данных о человеке, я создаю объект этого класса
в MainWinow. В главном окне приложения у меня множество различных texbox, для этого
объекта (имя, фамилия и т.д.). Можно ли как-то использую Binding, сделать так, что
бы при изменение объекта изменялись бы данные в соответствующих textbox, и наоборот,
при изменение в textbox, изменялись бы соответствующие поля в Piple?

Вот код  класса Piple:

namespace WpfApplication4
{
    public class Piple 
     {          
        public string name;
        public string name2;
        public Piple()
        {   
            name="Иван";
            name2="Иванов";
        }    
    }
}


Код главнного класса C#:  

  namespace WpfApplication4
  {
        /// 
        /// Логика взаимодействия для MainWindow.xaml
        /// 
        public partial class MainWindow : Window
        {
            Piple chel = new Piple();
            public MainWindow()
            {
                InitializeComponent();
                this.DataContext = this;                    
            }
         }
}


Код окна на XAML


    

        


        

    



Нужно соответственно привязать данныйе из chel.name и chel.name2 к соответствующим
textbox. Подскажите можно ли это сделать с помощью Binding?
    


Ответы

Ответ 1



Привязка к полям класса в WPF невозможна, Вам нужны хотя бы свойства (property). Чтобы при изменении свойств класса новые значения отображались в контроле, нужно чтобы класс был наследником интерфейса INotifyPropertyChanged Вы сами биндинги-то не прописали у TextBox'ов. Все это должно выглядеть как-то так: public class People : INotifyPropertyChanged // Наследуемся от нужного интерфеса { // Ваши поля private string name, name2; public event PropertyChangedEventHandler PropertyChanged; // Событие, которое нужно вызывать при изменении // Для удобства обернем событие в метод с единственным параметром - имя изменяемого свойства public void RaisePropertyChanged(string propertyName) { // Если кто-то на него подписан, то вызывем его if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } // А тут будут свойства, в которые мы обернем поля public string Name { get { return name; } set { // Устанавливаем новое значение name = value; // Сообщаем всем, кто подписан на событие PropertyChanged, что поле изменилось Name RaisePropertyChanged("Name"); } } public string Name2 { get { return name2; } set { // Устанавливаем новое значение name2 = value; // Сообщаем всем, кто подписан на событие PropertyChanged, что поле изменилось Name2 RaisePropertyChanged("Name2"); } } } В коде контрола создаем экземпляр класса и прописываем DataContext (на самом деле DataContext можно прописать и в разметке контрола): public MainWindow() { // Создаем экземпляр нашего класса P = new People(){Name = "Ololosha", Name2 = "Trololosha"}; InitializeComponent(); // Устанавливаем как контекст данных DataContext = P; } А в разметке контрола прописываем TextBox'ы: Вот теперь оно будет работать так, как вы хотите. Еще наверное надо упоминуть о таком свойстве биндинга как UpdateSourceTrigger. Оно описывает когда надо изменить источник. По умолчанию у TextBox'а стоит значение LostFocus, т.е. изменение произойдет только когда TextBox потеряет фокус. Если Вы хотите, чтобы изменения происходили сразу же, то Вам нужно UpdateSourceTrigger установить в PropertyChanged: Я бы Вам посоветовал найти хорошую книжку по WPF. Вот тут есть довольно неплохой сайт о WPF (и не только о нем), по крайней мере мне в свое время он очень помог

Комментариев нет:

Отправить комментарий