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