Dot-Net

WPF MVVM 創建動態控制項

  • April 26, 2011

WPF MVVM 創建動態控制項 - 我有一個網格,上面有一份工作(你可以說類似 sql server 工作)的詳細資訊。

現在,對於每項工作,都可能有“n”個工作變數。當我獲取作業的記錄時,它會獲取作業變數的集合,這些變數是名稱-值對,其中值可以是集合或日期時間值,甚至是 int 或字元串。

現在我要在這裡實現的是: - 如果執行變數是日期時間,那麼我需要一個日期選擇器 - 如果它是一個 int/String 我需要一個文本框 - 如果它是一個集合,那麼一個組合框。– 它是一個位域,然後是一個複選框

我不確定如何實現它,因為這些值可能因每項工作而異。

ItemsControl我假設您將通過設置其ItemsSource屬性將表示這些名稱/值對的某種對象放入 an中。

您可以使用幾種解決方案。

使用DataTemplatewith 觸發器:

這種方法涉及通過YourPropertyType屬性將每個對象的“類型”作為字元串公開。您將您的 設置ItemTemplateItemsControl託管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}"
/>

引用自:https://stackoverflow.com/questions/5267905