2011-12-29 24 views
7

我想在WPF中構建一套典型的CRUD維護表單 - 除了它們在不同的數據庫記錄上工作外,它們幾乎是相同的。基於DataContext的類型選擇用戶控件

而不是爲每個創建一個新的窗口類,我試圖使用一個單獨的窗口類,爲每個數據庫表使用不同的ViewModel類實例化,併爲此爲每個ViewModel定義了不同的UserControl。因此,如果我將其DataContext設置爲Record1ViewModel實例的實例化窗口,我想使用Record1UserControl將其顯示在窗口中,如果它設置爲Record2ViewModel的實例,我想使用Record2UserControl來顯示它。

我已驗證兩個用戶控件都能正常工作,方法是直接在窗口的XAML中定義它們。但我還沒有想出如何根據ViewModel的類型選擇其中之一。

這不是工作:

<myWindow.Resources> 

    <DataTemplate x:Key="{x:Type ViewModels:Record1ViewModel}"> 
     <MaintenanceControls:Record1 /> 
    </DataTemplate> 
    <DataTemplate x:Key="{x:Type ViewModels:Record2ViewModel}"> 
     <MaintenanceControls:Record1 /> 
    </DataTemplate> 

</myWindow.Resources> 

<ContentPresenter Content="{Binding}" /> 

我能得到什麼,在ContentPresenter,是該類型的名稱。 DataTemplates不使用。

任何想法?

+0

其實行選擇DataTemplate,這個作品,如果我用 2011-12-30 00:45:32

回答

4

可以使用DataTemplateSelector以在運行時動態的東西沿着

public class TaskListDataTemplateSelector : DataTemplateSelector 
    { 
     public override DataTemplate 
      SelectTemplate(object item, DependencyObject container) 
     { 
      FrameworkElement element = container as FrameworkElement; 

      if (element != null && item != null && item is Task) 
      { 
       Task taskitem = item as Task; 

       if (taskitem.Priority == 1) 
        return 
         element.FindResource("importantTaskTemplate") as DataTemplate; 
       else 
        return 
         element.FindResource("myTaskTemplate") as DataTemplate; 
      } 

      return null; 
     } 
    } 
+0

使用的DataTemplates xaml似乎工作,一旦我使用正確的屬性,但它看起來像使用DataTemplateSelector將允許我在代碼中選擇模板。 – 2011-12-30 00:56:50