Propriedades dinâmicas permitem mostrar e editar as propriedades que são atribuídos a uma categoria do Vault sem a necessidade de alterar o arquivo XAML.
Ao adicionar novas propriedades para uma categoria do Vault, estas propriedades aparecem automaticamente na próxima vez que a caixa de diálogo padrão de dados ou guia é exibida.
As propriedades dinâmicas são representadas por um controle XAML DataGrid
que tem duas colunas. A primeira coluna é de somente leitura e exibe o nome da propriedade. A segunda coluna é mais complexa porque ela precisa exibir controles diferentes para diferentes tipos (por exemplo, ComboBox para propriedades com uma lista predefinida de valores, DataPicker para propriedades de tipo Data).
Para adicionar as propriedades dinâmicas controlam a caixa de diálogo, as seguintes linhas são necessários:
...
<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>
...
A segunda coluna utiliza um estilo (cellstyle="{staticresourcedynamicdatagridcellstyle})
que também precisa ser adicionado ao arquivo XAML na seção Resources. Esta cuida de todos os diferentes controles:
...
<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
Examinar esta linha de código do exemplo anterior:
ItemsSource="{Binding DynamicProperties}"
Esse código obtém uma lista de elementos IProperty
que são atribuídos à categoria. O objeto IProperty
tem, entre outros, estes membros que podem ser utilizados em associações:
ListValues
: usado para as propriedades com uma lista predefinida de valores.Name
: nome da propriedade. O valor é usado para a primeira coluna.Value
: para obter e definir o valor da propriedade.DynamicProperties
retorna todas as propriedades atribuídas a uma categoria. Enquanto para CAD, somente as propriedades mapeadas são retornados. Isto é porque o padrão de dados para CAD não alterar diretamente as propriedades do Vault. As alterações são feitas por meio de mapeamento do Vault.DynamicPropertiesCategory
Para que a associação DynamicProperties
retorne algum resultado, uma categoria do Vault deve ser especificada primeiro. Na implementação padrão que vem com o Data Standard, DynamicPropertiesCategory
é especificada por meio de uma caixa combo:
...
<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>
...
A lista de categorias disponíveis do Vault (ItemsSource="{Binding PsList[GetCategories]}")
é retornada pela função GetCategories
do PowerShell. Na implementação padrão, isto retorna todas as categorias. Se somente determinadas categorias devem estar disponíveis (por exemplo, com base no tipo de documento), esta função deve ser ajustado.
A categoria selecionada na caixa combo define o DynamicPropertiesCategory:
(selecteditem="{binding-dynamicpropertiescategory}")
Clique aqui para saber mais sobre as legendas de propriedades dinâmicas.