В простой форме я связываю несколько различных объектов - некоторые идут в списках; некоторые в текстовых блоках.
У нескольких из этих объектов есть взаимодействующие объекты, для которых метод ToString()
вызывает при выполнении своей работы - обычно это какой-то форматер.
Когда я выполняю код, я вижу, что при настройке привязки данных,
ToString()
называется
- сотрудничающий объект не является
null
и возвращает ожидаемый результат
- при проверке в отладчике объекты возвращают ожидаемый результат из
ToString()
НО текст не отображается в форме.
Единственный общий поток, который я вижу, состоит в том, что они используют взаимодействующий объект, тогда как другие привязки, которые отображаются, как и ожидалось, просто работают из свойств и методов содержащего объекта.
Если это сбивает с толку, вот суть в коде:
public class ThisThingWorks
{
private SomeObject some_object;
public ThisThingWorks(SomeObject s) { some_object = s; }
public override string ToString() { return some_object.name; }
}
public class ThisDoesntWork
{
private Formatter formatter;
private SomeObject some_object;
public ThisDoesntWork(SomeObject o, Formatter f)
{
formatter = f;
some_object = o;
}
public override string ToString()
{
return formatter.Format(some_object.name);
}
}
Снова, позвольте мне повторить - метод ToString()
работает в любом другом контексте - но когда я связываюсь с объектом в WPF и ожидаю, что он отобразит результат ToString()
, я ничего не получить.
Обновление:
Проблема, по-видимому, заключается в том, что я вижу ошибочное поведение в привязке TextBlock
. Если я связываю свойство Text
со свойством DataContext
, которое объявлено как тип интерфейса, ToString()
никогда не вызывается. Если я изменю объявление свойства на реализацию интерфейса, оно будет работать как положено. Другие элементы управления, например Label
, работают нормально, когда привязывают свойство Content
к свойству DataContext
, объявленному как реализация или интерфейс.
Поскольку это так далеко от заголовка и содержания этого вопроса, я создал новый вопрос здесь: Поведение привязки WPF отличается, когда связанное свойство объявлено как интерфейс против типа класса?
изменил заголовок: Поведение привязки WPF отличается, когда связанное свойство объявлено как интерфейс против типа класса?