Динамические свойства позволяют отображать и редактировать свойства, которые назначены категории Vault без необходимости изменять файл XAML.
При добавлении новых свойств в категории Vault, эти свойства отображаются автоматически при следующем диалогового окна Data Standard или ", как показано на рисунке.
Динамические свойства представлены по ключевому слову XAML DataGrid
с двумя колоннами. Первый столбец предназначен только для чтения и отображает имя свойства. Второй столбец является более сложным, так как в нем должны отображаться различные элементы управления для различных типов (например, ** поле со списком** — для свойств с предварительно определенным списком значений, DataPicker — для свойств типа date).
Для добавления динамических свойств в диалоговом окне отображаются следующие строки:
...
<DataGrid x:Name="DSDynamicCategoryProperties"
AutoGenerateColumns="False"
HeadersVisibility="Column"
ItemsSource="{Binding DynamicProperties}"
ScrollViewer.CanContentScroll="False"
HorizontalGridLinesBrush="WhiteSmoke"
VerticalGridLinesBrush="WhiteSmoke">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Name}"
SortDirection="Ascending"
Width="140"
IsReadOnly="True" >
<DataGridTextColumn.HeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding DataContext.UIString[LBL64], RelativeSource={RelativeSource AncestorType=DataGrid}}"/>
</DataTemplate>
</DataGridTextColumn.HeaderTemplate>
</DataGridTextColumn>
<DataGridTemplateColumn CellStyle="{StaticResource DynamicDataGridCellStyle}"
Width="*" >
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding DataContext.UIString[LBL65], RelativeSource={RelativeSource AncestorType=DataGrid}}"/>
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
...
Второй столбец использует стиль (cellstyle="{staticresourcedynamicdatagridcellstyle})
, который также необходимо добавить в файл XAML в разделе «Ресурсы». Это обеспечивает все элементы управления:
...
<Window.Resources>
<Style x:Key="DynamicDataGridCellStyle" TargetType="{x:Type DataGridCell}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<ComboBox ItemsSource="{Binding ListValues}" Text="{WPF:ValidatedBinding Value}" IsEditable="True"></ComboBox>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
<Setter Property="BorderBrush" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
</Trigger>
<Trigger Property="IsKeyboardFocusWithin" Value="True">
<Setter Property="BorderBrush" Value="{DynamicResource {x:Static DataGrid.FocusBorderBrushKey}}"/>
</Trigger>
<DataTrigger Binding="{Binding ListValues.Count}" Value="0">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<TextBox Text="{WPF:ValidatedBinding Value}"></TextBox>
</ControlTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Typ}" Value="DateTime">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<DatePicker SelectedDate="{WPF:ValidatedBinding Value, StringFormat='dd/MM/yyyy'}"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Typ}" Value="Bool">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<ComboBox Text="{WPF:ValidatedBinding Value}">
<system:Boolean>True</system:Boolean>
<system:Boolean>False</system:Boolean>
</ComboBox>
</ControlTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
...
DynamicProperties
Рассмотрим следующий код в предыдущем примере:
ItemsSource="{Binding DynamicProperties}"
Этот код получает список элементов IProperty
, назначенных категории. Объект IProperty
содержит в том числе эти элементы, которые можно использовать для привязки:
ListValues
— используется для свойств со стандартным списком значений.Name
— имя свойства. Это значение будет использоваться для первого столбца.Value
— для получения и установки значения свойства.DynamicProperties
возвращает все свойства назначаются категории. В то время как для САПР, только сопоставленные свойства. Это происходит потому, что Data Standard для САПР не непосредственно изменить свойства Vault. Изменения выполняются с помощью Vault.DynamicPropertiesCategory
Чтобы привязка DynamicProperties
могла что-то вернуть, сначала необходимо задать категорию Vault. По умолчанию в реализации, поставляемой с Data Standard, DynamicPropertiesCategory
задается с помощью поля со списком:
...
<ComboBox
Name="Categories"
ItemsSource="{Binding PsList[GetCategories]}"
SelectedIndex="0"
DisplayMemberPath="Name"
selecteditem="{binding-dynamicpropertiescategory}"
Text="{Binding Prop[_Category].Value}" Grid.Row="0" Grid.Column="1"
IsEnabled="{Binding IsNewEntryDialog}">
</ComboBox>
...
Список доступных категорий Vault (ItemsSource="{Binding PsList[GetCategories]}")
возвращается функцией PowerShell GetCategories
. По умолчанию в внедрения это просто возвращает все категории. Если только определенных категорий должен быть доступен (например, на основе типа документа), эта функция должна быть скорректированы.
Выбранной категории в поле со списком задание DynamicPropertiesCategory:
(selecteditem="{binding-dynamicpropertiescategory}")
Щелкните здесь для получения дополнительных сведений о метках динамических свойств.