#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 (и не только о нем), по крайней мере мне в свое время он очень помог
Комментариев нет:
Отправить комментарий