Propriedades dinâmicas

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.

Utilize as propriedades dinâmicas em caixas de diálogo padrão de dados e guias

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).

Controle de DataGrid

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>
...

Associação XAML 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:

Observação: No Data Standard for Vault, 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.

Associação XAML 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.