привязка пользовательского класса свойств WPF

#c# #wpf #binding

#c# #wpf #привязка

Вопрос:

Я получил пользовательский класс свойств WPF с именем «RFPGegevens»

 public class RFPGegevens
{
    private string _klant;
    public String Klant
    {
        get { return _klant; }
        set { _klant = value; }
    }
 }
  

В моей ViewModel я получил свойство RFPGegevens

     private RFPGegevens _rfpGegevens;

    public RFPGegevens RfpGegevens
    {
        get
        {
            if (_rfpGegevens == null)
                _rfpGegevens = new RFPGegevens();
            return _rfpGegevens;
        }
        set
        {
            _rfpGegevens = value;
            base.RaisePropertyChangedEvent("RfpGegevens");
        }
    }
  

Это свойство заполнено правильно, если я выполняю отладку, это результат:

введите описание изображения здесь

На мой взгляд, я привязываю свойство «RFPGegevens» к datacontext моей сетки

 <Grid DataContext="{Binding RfpGegevens}">
  

и все же, если я выполняю отладку, поле свойства «Klant» заполняется.

введите описание изображения здесь

Но поскольку я привязываю это свойство в представлении, мое текстовое поле по-прежнему пустое.

 <TextBox Text="{Binding Klant, Mode=TwoWay}"/>
  

Я тоже пробовал это, но, похоже, ничего не работает:

 <TextBox Text="{Binding RFPGegevens.Klant, Mode=TwoWay}"/>
  

Не знаю, что я делаю не так.
Заранее спасибо 😉

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

1. Где вы отлаживали метод доступа к получению? Гарантируется ли, что он вызывается WPF для привязки текстового поля? Что говорит окно вывода в VS о привязке при запуске?

2. Правильно ли вы установили привязку Windows datacontext?

3. Реализует ли ваша ViewModel INotifyPropertyChanged, я вижу, что вы вызываете base.RaisePropertyChanged .

4. Я реализовал INotifyPropertyChanged, и Windows datacontext привязан правильно. И для Андреаса, не могли бы вы переформулировать свой вопрос, пожалуйста?

5. Итак, если вы помещаете текстовое поле за пределы сетки, оно привязывается правильно? И просто быстрая проверка.. Klant, Mode=TwoWay}»/> использует запрос запроса, в то время как ваш реквизит называется Rfp

Ответ №1:

попробуйте сделать две вещи

<TextBox Text="{Binding Klant, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

 public class RFPGegevens
{
    private string _klant;
    public String Klant
    {
        get { return _klant; }
        set {
              _klant = value; 
              //Raise the property changed event here
            }
    }
 }
  

Ответ №2:

Вам также необходимо реализовать интерфейс INotifyPropertyChanged для вашего пользовательского класса, как показано ниже:

 public class RFPGegevens : INotifyPropertyChanged
  

и вызывайте события propertychanged из набора средств доступа ваших свойств.

Ответ №3:

Вы забыли добавить наследование от INotifyPropertyChanged