Как обозначено выше, является, вероятно, самым легким просто проверить, существует ли функция перед использованием его. Если Вы действительно заботитесь, что это Date
, и не только объект с getMonth()
функция, попробуйте это:
function isValidDate(value) {
var dateWrapper = new Date(value);
return !isNaN(dateWrapper.getDate());
}
Это создаст или клон значения, если это будет Date
, или создайте недопустимую дату. Можно тогда проверить, недопустимо ли значение новой даты или нет.
Один из способов - использовать DataTemplateSelector
и каждый из них разрешает ресурс из отдельного ResourceDictionary
.
Помимо упомянутых аспектов: хорошо поддерживается, доступен стандарт, оптимизирован для производительности, разработан для использования с алгоритмами, я мог бы добавить еще один аспект: безопасность типов и множество проверок во время компиляции. Вы даже не можете себе представить, как нарисовать double
из std :: set
.
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, Андерсон
Джош Смит использует именно эту технику (управления вкладкой с помощью коллекции моделей представлений) в своей превосходной статье и образце проекта Приложения 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 для повышения производительности».