2017-04-18 65 views
0

在我的用戶的資源節中的代碼:WPF MVVM綁定ContentConrol的的ContentTemplate的靜態資源

<UserControl.Resources> 
    <DataTemplate x:Key="BillingLevel" DataType="{x:Type local:ViewBillingLevel}"> 
     <local:ViewBillingLevel Width="Auto" Height="Auto"/> 
    </DataTemplate> 
    <DataTemplate x:Key="Suburb" DataType="{x:Type local:ViewSuburb}"> 
     <local:ViewSuburb Width="Auto" Height="Auto" /> 
    </DataTemplate> 
</UserControl.Resources> 

我想做的結合部分:

<ContentControl Grid.Row="2" ContentTemplate="{StaticResource Suburb}" Margin="5" /> 

喜歡的東西:

<ContentControl Grid.Row="2" ContentTemplate="{StaticResource={Binding myDataTemplateKey}}" Margin="5" /> 

所以我可以在後面的C#代碼中的DataTemplates之間切換。 我不知道這是否可能,或者如何以另一種方式實現。

謝謝。

+0

是否要切換相同內容類型或其他內容的數據類型?我們是在談論2-3個不同的模板還是關於*許多*?爲了根據某些值管理少量模板,我可能會編寫一個基於DataTrigger的答案,但這對於具有許多不同模板的更通用的上下文來說並不有用。 – grek40

回答

2

您可以使用ContentTemplateSelector屬性和DataTemplateSelector類來實現自定義模板選擇邏輯:https://msdn.microsoft.com/en-us/library/system.windows.controls.contentcontrol.contenttemplateselector(v=vs.110).aspx

或者你可以使用隱式數據模板。卸下x:Key屬性:

<UserControl.Resources> 
    <DataTemplate DataType="{x:Type local:ViewBillingLevel}"> 
     <local:ViewBillingLevel Width="Auto" Height="Auto"/> 
    </DataTemplate> 
    <DataTemplate DataType="{x:Type local:ViewSuburb}"> 
     <local:ViewSuburb Width="Auto" Height="Auto" /> 
    </DataTemplate> 
</UserControl.Resources> 

適當DataTemplate隨後將自動應用作爲設置或ContentControlContent屬性綁定到ViewBillingLevel/ViewSuburb對象。

+1

隱式模板非常棒,這是您想要的@Elmer答案。在這裏不使用它們的唯一原因是如果您在設計時不知道所有可能的模板。 –

0

你想要的是一個DataTemplateSelector

C#

public class MyTemplateSelector : DataTemplateSelector 
    { 
     public DataTemplate BillingLevel 
     { 
      get; 
      set; 
     } 

     public DataTemplate Suburb 
     { 
      get; 
      set; 
     } 

     public override DataTemplate SelectTemplate(object item, DependencyObject container) 
     { 
      if(item is ViewBillingLevel) 
      { 
       return BillingLevel; 
      } 

      if(item is ViewSuburb) 
      { 
       return Suburb; 
      } 

      return base.SelectTemplate(item, container); 
     } 
    } 

XAML

<UserControl.Resources> 

    <DataTemplate x:Key="BillingLevel"> 

    </DataTemplate> 
    <DataTemplate x:Key="Suburb"> 

    </DataTemplate> 

    <selector:MyTemplateSelector x:Key="MyTemplateSelector" 
           Suburb="{StaticResource Suburb}" 
           BillingLevel="{StaticResource BillingLevel}" 
           /> 


</UserControl.Resources> 

<ContentControl Content="{Binding MyV}" 
       ContentTemplateSelector="{StaticResource MyTemplateSelector}" 
       /> 

MyV是您的ViewModel綁定 - 因此DataTemplateSelector決定使用哪個模板。

Extendend:

如果你只有一個ViewModel - 您可以使用屬性來切換模板。例如

public class MyTemplateSelector : DataTemplateSelector 
{ 
    public DataTemplate BillingLevel 
    { 
     get; 
     set; 
    } 

    public DataTemplate Suburb 
    { 
     get; 
     set; 
    } 

    public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 


MyViewModel value = item as MyViewModel; 

     if(value.IsSuburb) 
     { 
      return Suburb; 
     } 
     else 
     { 
      return BillingLevel; 
     } 

     return base.SelectTemplate(item, container); 
    } 
}