WPF MVVM 創建動態控制項
WPF MVVM 創建動態控制項 - 我有一個網格,上面有一份工作(你可以說類似 sql server 工作)的詳細資訊。
現在,對於每項工作,都可能有“n”個工作變數。當我獲取作業的記錄時,它會獲取作業變數的集合,這些變數是名稱-值對,其中值可以是集合或日期時間值,甚至是 int 或字元串。
現在我要在這裡實現的是: - 如果執行變數是日期時間,那麼我需要一個日期選擇器 - 如果它是一個 int/String 我需要一個文本框 - 如果它是一個集合,那麼一個組合框。– 它是一個位域,然後是一個複選框
我不確定如何實現它,因為這些值可能因每項工作而異。
ItemsControl我假設您將通過設置其ItemsSource屬性將表示這些名稱/值對的某種對象放入 an中。您可以使用幾種解決方案。
使用
DataTemplatewith 觸發器:這種方法涉及通過
YourPropertyType屬性將每個對象的“類型”作為字元串公開。您將您的 設置ItemTemplate為ItemsControl託管ContentControl. 它ContentControl本身將ContentTemplate通過觸發器動態選擇。所有這些都可以在 XAML 中以聲明方式完成。
我假設您已經進一步
DataTemplates命名DefaultTemplate(這可以是空的)IntegerTemplate、、、StringTemplate等,以勾勒出每種情況的視覺化樹。這將是
ItemsControl.ItemTemplate:<DataTemplate> <ContentControl x:Name="MyContentControl" Content="{Binding}" ContentTemplate="{StaticResource DefaultTemplate}"/> <DataTemplate.Triggers> <DataTrigger Binding="{Binding YourPropertyType}" Value="Integer"> <Setter TargetName="MyContentControl" Property="ContentTemplate" Value="{StaticResource IntegerTemplate}" /> </DataTrigger> <DataTrigger Binding="{Binding YourPropertyType}" Value="String"> <Setter TargetName="MyContentControl" Property="ContentTemplate" Value="{StaticResource StringTemplate}" /> </DataTrigger> <!-- and so on --> </DataTemplate.Triggers> </DataTemplate>使用
DataTemplateSelector:這種方法需要程式碼隱藏,但它不會強制您將每個名稱/值對的“類型”公開為字元串,它允許您選擇使用哪個模板來處理更複雜的邏輯。
它涉及創建一個作為模板選擇器的類:
class YourObjectDataTemplateSelector : DataTemplateSelector { public DataTemplate DefaultTemplate { get; set; } public override DataTemplate SelectTemplate(object item, DependencyObject container) { var yourObject = (YourObjectType) item; // Get hold of a DataTemplate based on any attribute of item var templateToUse = this.DefaultTemplate; return templateToUse; } }然後,您需要在某處實例化一個模板選擇器(假設在您的
UserControl.<UserControl.Resources> <localNamespace:YourObjectDataTemplateSelector x:Key="TemplateSelector" DefaultTemplate="{StaticResource DefaultTemplate}" /> </UserControl.Resources>請注意,我從 XAML 公開了一個
DefaultTemplate屬性YourObjectDataTemplateSelector並將其設置為模板。在實踐中,您將定義更多 on 類型DataTemplate的屬性YourObjectDataTemplateSelector,並在將模板選擇器添加到控制項的資源字典時“配置”它。這允許您使用StaticResourceXAML 中的標記擴展直接為每個案例設置模板。最後,將模板選擇器連接到您的
ItemsControl:<ItemsControl ItemsSource="..." ItemTemplateSelector={StaticResource TemplateSelector}" />