動態性質

動態性質可讓您展示和編輯指定給 Vault 品類的性質,而無需修改 XAML 檔案。

將新性質加入至 Vault 品類後,在下次展示「Data Standard」對話方塊或頁籤時,這些性質會自動顯示。

在「Data Standard」對話方塊和頁籤中使用動態性質

動態性質由具有兩欄的 XAML DataGrid 控制來表示。第一欄是唯讀的,並展示性質名稱。第二欄更加複雜,因為它必須針對不同類型顯示不同的控制 (例如,為具有預先定義值清單的性質顯示 ComboBox,為日期類型的性質顯示 DataPicker)。

DataGrid 控制

若要將動態性質控制項加入至對話方塊,需要以下行:

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

XAML 繫結 DynamicProperties

請看上一個範例中的此行程式碼:

ItemsSource="{Binding DynamicProperties}"

此程式碼會取得指定給品類的 IProperty 元素清單。IProperty 物件具有可用於繫結的這些成員:

注意事項: 在 Data Standard for Vault 中,DynamicProperties 會傳回指定給品類的所有性質。而對於 CAD,則僅傳回對映的性質。這是因為 Data Standard for CAD 不會直接變更 Vault 性質。變更透過 Vault 對映完成。

XAML 繫結 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}")

按一下此處,以進一步瞭解動態性質標示。