У меня есть TabControl, связанный с его свойством ViewModel Items:
<TabControl ItemsSource="{Binding Items}"/>
Это класс Viewmodel:
public class ViewModel
{
public ObservableCollection<object> Items { get; } = new ObservableCollection<object>();
public ViewModel()
{
Items.Add(new Person() { FirstName = "Alan", LastName = "Turing" });
Items.Add(new Car() { ModelName = "Fiesta", Manifacturer = "Ford" });
}
}
Items
Тип * ObservableCollection<object>
; это связано с тем, что каждая вкладка представляет объект различного вида , в данном примере это человек и автомобиль.
Вопрос
Я хочу связать заголовок вкладки с текстом, который недоступен как свойство связанных классов, скажем, предоставленный вручную заголовок.
Например, я бы хотел например, первая вкладка с заголовком «Персона», а вторая - с заголовком «Автомобиль»:
Я думал о :
- добавление свойства Header к каждому классу. Это легко и просто с точки зрения привязки, но это своего рода обобщенный просмотрщик, и не все интерфейсы входных данных могут быть изменены.
- «прикрепленное свойство» по-прежнему требует действия на уровне класса; но выполнимо, но, вероятно, немного излишне
A Dictionary<object, string>
определено на уровне модели представления, давайте назовем его Заголовки.
Каждый раз, когда я добавляю объект в коллекцию, я также добавляю Заголовок в словарь заголовков. Его ключом будет сам объект.
Person p = new Person() { FirstName = "Alan", LastName = "Turing" };
Headers.Add(p, "Person");
Items.Add(p);
Но как тогда написать выражение привязки?
<TabControl ItemsSource="{Binding Items}">
<TabControl.ItemTemplate>
<DataTemplate>
<Label Content="{Binding ????????}"/>
</DataTemplate>
</TabControl.ItemTemplate>
</TabControl>
Даже если это возможно, похоже, что это решение не очень «дружелюбный».
Кажется, здесь есть две проблемы: динамически прикрепить информацию к экземпляру и получить к ней доступ через привязку.
Есть идеи?
Постскриптум - код
Код, для полноты. Мои классы:
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class Car
{
public string ModelName { get; set; }
public string Manifacturer { get; set; }
}
Мой DataTemplate, определенный в теге <Winodow.Resources>
.
<DataTemplate DataType="{x:Type local:Person}">
<StackPanel>
<Label Content="{Binding FirstName}"/>
<Label Content="{Binding LastName}"/>
</StackPanel>
</DataTemplate>
<DataTemplate DataType="{x:Type local:Car}">
<StackPanel>
<Label Content="{Binding Manifacturer}"/>
<Label Content="{Binding ModelName}"/>
</StackPanel>
</DataTemplate>