Почему привязки данных WPF не показывают текст, когда ToString () имеет взаимодействующий объект? - PullRequest
2 голосов
/ 26 мая 2010

В простой форме я связываю несколько различных объектов - некоторые идут в списках; некоторые в текстовых блоках.

У нескольких из этих объектов есть взаимодействующие объекты, для которых метод ToString() вызывает при выполнении своей работы - обычно это какой-то форматер.

Когда я выполняю код, я вижу, что при настройке привязки данных,

  1. ToString() называется
  2. сотрудничающий объект не является null и возвращает ожидаемый результат
  3. при проверке в отладчике объекты возвращают ожидаемый результат из 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 отличается, когда связанное свойство объявлено как интерфейс против типа класса?

1 Ответ

0 голосов
/ 27 мая 2010

Попробуйте эти простые изменения:

Сначала проверьте вашу программу с помощью этой версии метода:

public override string ToString()
{
    return "This method's really being called."
}

Если это действительно что-то отображает в пользовательском интерфейсе, попробуйте эту версию:

public override string ToString()
{
    Console.WriteLine(
       string.Format("some_object.name = {0}, formatter.Format(some_object.name) = {1}",
          some_object.name,
          formatter.Format(some_object.name));
    return formatter.Format(some_object.name);
}

Если это не заставит вас понять, что на самом деле не так, я буду очень удивлен.

...