Wpf 绑定内容模板

Wpf 绑定内容模板,wpf,data-binding,mvvm,Wpf,Data Binding,Mvvm,对于WPF和MVVM来说,这是一个全新的概念,我正在尝试将ContentTemplate(或ItemTemplate,两者都不起作用)绑定到C#WPF程序中的DataTemplate属性。我这样做是因为我有一个配置文件,为每个“条目”定义了不同的“条目显示类型”,以避免产生无数的视图/视图模型(目前,只有一个通用的条目视图模型可以跟踪标签、数据和显示类型,我更愿意这样做以避免类结构不必要的膨胀)。有什么方法可以做到这一点吗 这是我尝试过的一个例子: XAML: 资源XAML: <DataT

对于WPF和MVVM来说,这是一个全新的概念,我正在尝试将ContentTemplate(或ItemTemplate,两者都不起作用)绑定到C#WPF程序中的DataTemplate属性。我这样做是因为我有一个配置文件,为每个“条目”定义了不同的“条目显示类型”,以避免产生无数的视图/视图模型(目前,只有一个通用的条目视图模型可以跟踪标签、数据和显示类型,我更愿意这样做以避免类结构不必要的膨胀)。有什么方法可以做到这一点吗

这是我尝试过的一个例子:

XAML:

资源XAML:

<DataTemplate x:Key="TypeTest">
<TextBlock Margin="2,6">
  <TextBlock Text="{Binding Path=PropertyName}" />
</TextBlock>


当我用它运行时,没有显示任何内容。但是,如果我将资源数据模板的内容直接放在内容控件的位置上,情况会很好地显示出来(除了它不是以我想要的方式进行数据驱动)。任何帮助/建议都将不胜感激。谢谢!

我真诚地说,您的做法大多是错误的=)

将模板存储在ViewModel中通常是个坏主意,因为这样会在VM中存储图形对象。这应该在视图侧完成

如果您希望根据项目类型或其他任何内容使用可变的DataTemplate,以下是一些可选的“更清洁”解决方案:

先决条件:所有模板都定义为某个地方的资源

假设您有一个
ResourceDictionary
,其中包含以下内容,用于测试目的:

<DataTemplate x:Key="Template1" />
<DataTemplate x:Key="Template2" />
<DataTemplate x:Key="Template3" />
以下是转换器的外观(注意:这里的
对象是绑定对象,在您的示例中,您使用的是它的类型,因此本示例也与类型有关)

这会对你有好处的

我想这两种解决方案都会起作用,而且更干净,但请注意这正是
ItemTemplateSelector
的目的。
Converter
方法就是我使用的方法。在我了解这些模板选择器之前,我不再使用它


干杯

我真的想说你大部分都做错了=)

将模板存储在ViewModel中通常是个坏主意,因为这样会在VM中存储图形对象。这应该在视图侧完成

如果您希望根据项目类型或其他任何内容使用可变的DataTemplate,以下是一些可选的“更清洁”解决方案:

先决条件:所有模板都定义为某个地方的资源

假设您有一个
ResourceDictionary
,其中包含以下内容,用于测试目的:

<DataTemplate x:Key="Template1" />
<DataTemplate x:Key="Template2" />
<DataTemplate x:Key="Template3" />
以下是转换器的外观(注意:这里的
对象是绑定对象,在您的示例中,您使用的是它的类型,因此本示例也与类型有关)

这会对你有好处的

我想这两种解决方案都会起作用,而且更干净,但请注意这正是
ItemTemplateSelector
的目的。
Converter
方法就是我使用的方法。在我了解这些模板选择器之前,我不再使用它


干杯

看起来模板选择器为我提供了所需的内容。谢谢!看起来模板选择器为我提供了所需的内容。谢谢!
<DataTemplate x:Key="Template1" />
<DataTemplate x:Key="Template2" />
<DataTemplate x:Key="Template3" />
<DataTemplate>
      <ContentControl ContentTemplate="{Binding Converter={StaticResource MyConverter}}" />
    </DataTemplate>
public class MyConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value.GetType() == typeof(WhateverYouWant))
        {
        return (DataTemplate)Application.Current.FindResource("OneTemplate");
        } 
        else if (value.getType() == typeof(AnotherTypeHere))
        {
        return (DataTemplate)Application.Current.FindResource("AnotherTemplate");
        }
        // other cases here...
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value; //We don't care about this!
    }
}