WPF MVVM绑定ContentConrol的ContentTemplate的StaticResource

时间:2017-04-18 13:03:20

标签: wpf mvvm

我的UserControl资源部分中的代码:

<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之间切换。 我不知道这是否可行,或者如何以另一种方式实现这一目标。

感谢。

2 个答案:

答案 0 :(得分:2)

您可以使用$(".add-icon").click(function(){ $("#emotepicker").toggle(); }); 属性和ContentTemplateSelector类来实现自定义模板选择逻辑:https://msdn.microsoft.com/en-us/library/system.windows.controls.contentcontrol.contenttemplateselector(v=vs.110).aspx

或者您可以使用隐式数据模板。删除DataTemplateSelector属性:

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> 的{​​{1}}属性设置或绑定到DataTemplate / Content对象时,将自动应用相应的ContentControl。< / p>

答案 1 :(得分: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);
    }
}