Это началось со странного поведения, которое, как мне показалось, было связано с моей реализацией ToString()
, и я задал этот вопрос: Почему привязки данных WPF не показывают текст, когда ToString () имеет взаимодействующий объект?
Оказывается, не имеет ничего общего с соавторами и воспроизводимо.
Когда я связываю Label.Content
со свойством DataContext
, которое объявлено как тип интерфейса, ToString()
вызывается для объекта времени выполнения, и метка отображает результат.
Когда я связываю TextBlock.Text
с тем же свойством, ToString()
никогда не вызывается и ничего не отображается. Но , если я изменю объявленное свойство на конкретную реализацию интерфейса, оно будет работать как положено.
Это как-то задумано? Если это так, есть идеи, почему?
Воспроизвести:
- Создание нового приложения WPF (.NET 3.5 SP1)
- Добавьте следующие классы:
public interface IFoo
{
string foo_part1 { get; set; }
string foo_part2 { get; set; }
}
public class Foo : IFoo
{
public string foo_part1 { get; set; }
public string foo_part2 { get; set; }
public override string ToString()
{
return foo_part1 + " - " + foo_part2;
}
}
public class Bar
{
public IFoo foo
{
get { return new Foo {foo_part1 = "first", foo_part2 = "second"}; }
}
}
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
DataContext = new Bar();
}
}
Когда вы запустите это приложение, вы увидите текст только один раз (вверху, на ярлыке). Если вы измените тип свойства foo
в классе Bar
на Foo
(вместо IFoo
) и снова запустите приложение, вы увидите текст в обоих элементах управления.