首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >绑定ContentTemplate

绑定ContentTemplate
EN

Stack Overflow用户
提问于 2012-09-22 04:21:46
回答 1查看 4.4K关注 0票数 1

对于WPF和MVVM非常陌生,我正在尝试将ContentTemplate (或ItemTemplate,两者都不起作用)绑定到C# WPF程序中的DataTemplate属性。我之所以这样做,是因为我有一个配置文件,它为每个“条目”定义了不同的“条目显示类型”,这样就不必创建无数的视图/视图模型(目前,只有一个通用的条目视图模型来跟踪标签、数据和显示类型,我更愿意保持这种方式,以避免类结构的不必要膨胀)。有没有办法让这件事起作用呢?

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

XAML:

代码语言:javascript
复制
<ItemsControl IsTabStop="False" ItemsSource="{Binding Path=FNEntries}"Margin="12,46,12,12">
  <ItemsControl.ItemTemplate>
    <DataTemplate>
      <ContentControl ContentTemplate="{Binding Path=TypeView}" />
    </DataTemplate>
  </ItemsControl.ItemTemplate>
</ItemsControl>

CS (在入口视图模型类构造函数中,它具有(DataTemplate)TypeView和(string)PropertyName):

代码语言:javascript
复制
NodeTypeView = (DataTemplate)Application.Current.FindResource("TypeTest");

资源XAML:

代码语言:javascript
复制
<DataTemplate x:Key="TypeTest">
<TextBlock Margin="2,6">
  <TextBlock Text="{Binding Path=PropertyName}" />
</TextBlock>

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-22 05:08:00

我要坦率地说,你基本上做错了=)

将模板存储在ViewModel中通常不是一个好主意,因为您会将图形对象存储在VM中。这应该在View端完成

如果你想要一个根据你的项目类型或者其他任何东西的变量DataTemplate,这里有一些替代的,“更干净”的解决方案:

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

假设您在某处有一个包含以下内容的ResourceDictionary,用于测试:

代码语言:javascript
复制
<DataTemplate x:Key="Template1" />
<DataTemplate x:Key="Template2" />
<DataTemplate x:Key="Template3" />

解决方案1:使用 ItemTemplateSelector

(最干净的解决方案imho)对于这件事,如果我能理解的话,我会把你重定向到this excellent tutorial which taught me how to use it,你绝对不能=D

解决方案2:在 Binding中使用转换器

让我们稍微更改一下您的Binding,使用一个转换器将其绑定到当前对象本身

代码语言:javascript
复制
<DataTemplate>
      <ContentControl ContentTemplate="{Binding Converter={StaticResource MyConverter}}" />
    </DataTemplate>

下面是转换器的样子(注意:这里的value对象是绑定对象,在本例中是使用它的类型,所以这个例子也是关于类型的)

代码语言:javascript
复制
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!
    }
}

这将为你做这个把戏

我猜这两个解决方案都会有效,而且更干净,但要注意这正是ItemTemplateSelector的目标。Converter方法是我在了解这些模板选择器之前使用的方法,我现在不再使用它了

干杯!

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12537658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档