2017-04-18 70 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); 
    } 
}