Właściwości dynamiczne

Właściwości dynamiczne umożliwiają wyświetlanie i edycję właściwości, które są przypisane do kategorii programu Vault bez konieczności modyfikowania pliku XAML.

Po dodaniu nowych właściwości do kategorii programu Vault te właściwości są wyświetlane automatycznie podczas następnego otwarcia okna dialogowego lub karty Data Standard.

Używanie właściwości dynamicznych w oknach dialogowych i kartach Data Standard

Właściwości dynamiczne są reprezentowane przez kontrolkę XAML DataGrid, która zawiera dwie kolumny. Pierwsza kolumna jest tylko do odczytu i zawiera nazwę właściwości. Druga kolumna jest bardziej skomplikowana, ponieważ są w niej wyświetlane różne kontrolki dla różnych typów (np. ComboBox dla właściwości z listą wstępnie zdefiniowanych wartości, DataPicker dla właściwości typu data).

Kontrolka DataGrid

Aby dodać kontrolkę właściwości dynamicznych do okna dialogowego, wymagane są następujące wiersze:

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

W drugiej kolumnie jest używany styl (cellstyle="{staticresourcedynamicdatagridcellstyle}), który należy dodać także do pliku XAML w sekcji Resources. W ten sposób można zapewnić obsługę wszystkich innych kontrolek:

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

Powiązanie XAML DynamicProperties

Spójrzmy na ten wiersz kodu w poprzednim przykładzie:

ItemsSource="{Binding DynamicProperties}"

Ten kod pobiera listę elementów IProperty, które są przypisane do kategorii. Obiekt IProperty ma, oprócz innych, te składniki, które mogą być użyte w powiązaniach:

Uwaga: w rozwiązaniu Data Standard dla programu Vault DynamicProperties zwraca wszystkie właściwości przypisane do kategorii. Natomiast w przypadku aplikacji CAD zwracane są tylko właściwości odwzorowane. Jest to spowodowane tym, że rozwiązanie Data Standard dla aplikacji CAD nie zmienia bezpośrednio właściwości programu Vault. Zmiany są wykonywane przez odwzorowanie programu Vault.

Powiązanie XAML DynamicPropertiesCategory

Aby powiązanie DynamicProperties coś zwracało, kategoria programu Vault musi być określona jako pierwsza. W domyślnej implementacji, która jest dostarczana z rozwiązaniem Data Standard, obiekt DynamicPropertiesCategory jest określany za pomocą pola kombi:

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

Lista dostępnych kategorii programu Vault (ItemsSource="{Binding PsList[GetCategories]}") jest zwracana przez funkcję PowerShell GetCategories. W domyślnej implementacji zwracane są po prostu wszystkie kategorie. Jeśli tylko pewne kategorie powinny być dostępne (np. w oparciu o typ dokumentu), ta funkcja musi zostać dostosowana.

Kategoria wybrana w polu kombi ustawia obiekt DynamicPropertiesCategory:

(selecteditem="{binding-dynamicpropertiescategory}")

Kliknij tutaj, aby uzyskać więcej informacji na temat etykiet właściwości dynamicznych.