2017-02-22 48 views
2
  1. Мой текстовый редактор WPF TextBox использует экземпляр класса (называемый «SelectedDocument») в качестве своего документа. Этот класс реализует INOtifyPropertyChanged.
  2. Экземпляр SelectedDocument имеет еще один объект типа «CellContent» (называемый «Описание»), открытый через свойство.
  3. CellContent также реализует INotifyPropertyChanged.
  4. Класс CellContent имеет свойство string ("TextValue"), к которому можно привязать.
  5. Я привязываю свойство TextBox Text к этому свойству TextValue. Как так:WPF Databinding - Getter/Setter для промежуточного объекта, который не попадает

    <TextBox DataContext="{Binding SelectedDocument}" Text="{Binding Path=Description.TextValue" /> 
    

Нет проблем с привязки данных - это работает в обоих направлениях. Но для этого связывания с работы, WPF предположительно должен ударить по Описание объекта недвижимости в SelectedDocument каждый раз, чтобы извлечь объект CellContent:

public CellContent Description 
{ get; set; } 

(. Это свойство является более сложным в моем коде) Затем WPF может достигнуть внутри фактический объект CellContent и get/set TextValue.

Проблема: Свойство Описание никогда не попадает. Похоже, что WPF обходит его и создал прямое подключение к свойству TextValue внутри объекта Description. Я хочу, чтобы каждый раз попадал в getter и seters Description, чтобы я мог выполнить там какой-то дополнительный код.

Как это сделать?

+0

Без хорошего [mcve] невозможно сделать какое-либо уверенное заявление о том, что происходит. Но совершенно естественно, что WPF не выдает значение свойства «Описание», если это значение действительно не изменится. Пока все, что изменилось, это 'Description.TextValue', будет восстановлено свойство' TextValue'. Учитывая это, вам нужно задать другой вопрос: как решить любую более широкую задачу, которую вы имеете, привело вас к этому ошибочному дизайну, где вы ожидали, что значение свойства будет восстановлено, даже если нет никаких причин для этого. –

+0

Поскольку мы не знаем, что такое более широкая цель, мы фактически не можем вам помочь. Пока что все, что мы можем сделать, это сказать вам, что структура работает так, как ожидалось, и что это ваше ожидание ошибочно. –

+0

В базовом дизайне на самом деле не так много магии: Описание используется как свойство строки, и я использовал для этого прямое связывание. В этом свойстве Description был добавлен дополнительный код (каждый раз, когда данные возвращаются, документ помечен как Dirty). Теперь каждый фрагмент данных больше, чем просто строка, поэтому имеет смысл инкапсулировать все это в новый класс и получить доступ к этому классу через старое свойство. За исключением того, что он больше не попадает. – Drakestar

ответ

2

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

Я предполагаю, что ваш CurrentDocument выглядит примерно так.

public class Doc 
{ 
    public Doc() 
    { 
     _description = new CellContent(); 
     // subscribe to changes in child 
     _description.PropertyChanged += DescriptionChanged; 
    } 

    private void DescriptionChanged(object sender, PropertyChangedEventArgs e) 
    { 
     Debug.Write($"I'm a dirty dirty document. Property {e.PropertyName} has changed"); 
    } 

    private CellContent _description; 
    public CellContent Description 
    { 
     get 
     { 
      Debug.Write("I assure you this is called every time a getter of the child properties is called"); 
      return _description; 
     } 
     // If you have a setter, don't forget to -= unsubscribe and resubscribe += after changing 
    } 
} 
+0

Спасибо, что потакали моей глупости выше. Я буду отмечать это как правильно, потому что ... ну, вот как вы должны это делать, в конце концов. – Drakestar

0

Попробуйте поднять PropertyChanged Событие для описания каждый раз, когда вы меняете TextValue Недвижимость.

+0

Хм, как бы я это сделал? Все инициируется прямо из XAML посредством привязки данных. – Drakestar

+0

Ну, в основном, что сказал NPras :) – Shadowed