WPF TabControl и DataTemplates

Как обозначено выше, является, вероятно, самым легким просто проверить, существует ли функция перед использованием его. Если Вы действительно заботитесь, что это Date , и не только объект с getMonth() функция, попробуйте это:

function isValidDate(value) {
    var dateWrapper = new Date(value);
    return !isNaN(dateWrapper.getDate());
}

Это создаст или клон значения, если это будет Date, или создайте недопустимую дату. Можно тогда проверить, недопустимо ли значение новой даты или нет.

8
задан dustyburwell 28 August 2009 в 05:30
поделиться

3 ответа

Один из способов - использовать DataTemplateSelector и каждый из них разрешает ресурс из отдельного ResourceDictionary .

7
ответ дан 3 November 2019 в 12:50
поделиться

Помимо упомянутых аспектов: хорошо поддерживается, доступен стандарт, оптимизирован для производительности, разработан для использования с алгоритмами, я мог бы добавить еще один аспект: безопасность типов и множество проверок во время компиляции. Вы даже не можете себе представить, как нарисовать double из std :: set .

. определяется примерно так (легко вставить базовую ViewModel, если она у вас есть):

public Type Type 
{ 
   get { return this.GetType(); } 
}

Итак, пока она у вас есть, это должно позволить вам делать все, что вы хотите. Обратите внимание, у меня есть «Заголовок!» в текстовом блоке здесь, но это может быть что угодно (значок и т. д.).

У меня есть два способа ... один стиль применяет шаблоны (если вы уже вложили в них значительные средства), а другой просто использует сеттеры для перемещения содержимого в нужные места.

<Window x:Class="WpfApplication1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="300" Width="300"
        xmlns:local="clr-namespace:WpfApplication1">
    <Window.Resources>
        <CompositeCollection x:Key="MyCollection">
            <local:AViewModel Header="A Viewmodel" Content="A Content" />
            <local:BViewModel Header="B ViewModel" Content="B Content" />
        </CompositeCollection>

    <DataTemplate x:Key="ATypeHeader" DataType="{x:Type local:AViewModel}">
        <WrapPanel>
            <TextBlock>A Header!</TextBlock>
            <TextBlock Text="{Binding Header}" />
        </WrapPanel>
    </DataTemplate>
    <DataTemplate x:Key="ATypeContent" DataType="{x:Type local:AViewModel}">
        <StackPanel>
            <TextBlock>Begin "A" Content</TextBlock>
            <TextBlock Text="{Binding Content}" />
        </StackPanel>
    </DataTemplate>

    <Style x:Key="TabItemStyle" TargetType="TabItem">
        <Style.Triggers>
            <!-- Template Application Approach-->
            <DataTrigger Binding="{Binding Path=Type}" Value="{x:Type local:AViewModel}">
                <Setter Property="HeaderTemplate" Value="{StaticResource ATypeHeader}" />
                <Setter Property="ContentTemplate" Value="{StaticResource ATypeContent}" />
            </DataTrigger>

            <!-- Just Use Setters Approach -->
            <DataTrigger Binding="{Binding Path=Type}" Value="{x:Type local:BViewModel}">
                <Setter Property="Header">
                    <Setter.Value>
                        <WrapPanel>
                            <TextBlock Text="B Header!"></TextBlock>
                            <TextBlock Text="{Binding Header}" />
                        </WrapPanel>
                    </Setter.Value>
                </Setter>
                <Setter Property="Content" Value="{Binding Content}" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>
<Grid>
    <TabControl ItemContainerStyle="{StaticResource TabItemStyle}" ItemsSource="{StaticResource MyCollection}" />
</Grid>

HTH, Андерсон

8
ответ дан 3 November 2019 в 12:50
поделиться

Джош Смит использует именно эту технику (управления вкладкой с помощью коллекции моделей представлений) в своей превосходной статье и образце проекта Приложения WPF с шаблоном проектирования модель-представление-модель представления . В этом подходе, поскольку каждый элемент в коллекции виртуальных машин имеет соответствующий шаблон данных, связывающий представление с типом виртуальной машины (опуская ключ x: Key, как правильно отмечает Андерсон Имес), каждая вкладка может иметь совершенно другой пользовательский интерфейс. Подробности см. В полной статье и исходном коде.

Ключевые части XAML:

 <DataTemplate DataType="{x:Type vm:CustomerViewModel}">
   <vw:CustomerView />
 </DataTemplate>

<DataTemplate x:Key="WorkspacesTemplate">
<TabControl 
  IsSynchronizedWithCurrentItem="True" 
  ItemsSource="{Binding}" 
  ItemTemplate="{StaticResource ClosableTabItemTemplate}"
  Margin="4"
  />

Есть один недостаток - управление WPF TabControl из ItemsSource приводит к проблемам с производительностью, если пользовательский интерфейс на вкладках большой / сложный и поэтому отрисовка выполняется медленно (например, таблицы данных с большим количеством данных). Для получения дополнительной информации по этой проблеме выполните поиск SO по запросу «WPF VirtualizingStackPanel для повышения производительности».

1
ответ дан 3 November 2019 в 12:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: