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.
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:
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 za pomocą funkcji programu 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.