WPF TabControl: словарь для заголовков вкладок - PullRequest
0 голосов
/ 27 января 2020

У меня есть 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>; это связано с тем, что каждая вкладка представляет объект различного вида , в данном примере это человек и автомобиль.

Вопрос

Я хочу связать заголовок вкладки с текстом, который недоступен как свойство связанных классов, скажем, предоставленный вручную заголовок.
Например, я бы хотел например, первая вкладка с заголовком «Персона», а вторая - с заголовком «Автомобиль»:

Person And Car As Tab's Headers

Я думал о :

  • добавление свойства 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>

1 Ответ

1 голос
/ 27 января 2020

Вы также можете переопределить метод ToString() для вашей классифицированной модели и вернуть оттуда ваше понятное имя.

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public override string ToString()
    {
        return "Person";
    }
}

Шаблон

<TabControl ItemsSource="{Binding Items}">
    <TabControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding}"/>
        </DataTemplate>
    </TabControl.ItemTemplate>
</TabControl>
...