对于WPF和MVVM非常陌生,我正在尝试将ContentTemplate (或ItemTemplate,两者都不起作用)绑定到C# WPF程序中的DataTemplate属性。我之所以这样做,是因为我有一个配置文件,它为每个“条目”定义了不同的“条目显示类型”,这样就不必创建无数的视图/视图模型(目前,只有一个通用的条目视图模型来跟踪标签、数据和显示类型,我更愿意保持这种方式,以避免类结构的不必要膨胀)。有没有办法让这件事起作用呢?
这是我尝试过的一个例子:
XAML:
<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):
NodeTypeView = (DataTemplate)Application.Current.FindResource("TypeTest");资源XAML:
<DataTemplate x:Key="TypeTest">
<TextBlock Margin="2,6">
<TextBlock Text="{Binding Path=PropertyName}" />
</TextBlock>当我运行它的时候,什么也没有显示出来。但是,如果我将资源数据模板的内容直接放在content控件的位置,事情就会显示得很好(除了它不是以我想要的方式进行数据驱动)。任何帮助/建议都将不胜感激。谢谢!
发布于 2012-09-22 05:08:00
我要坦率地说,你基本上做错了=)
将模板存储在ViewModel中通常不是一个好主意,因为您会将图形对象存储在VM中。这应该在View端完成
如果你想要一个根据你的项目类型或者其他任何东西的变量DataTemplate,这里有一些替代的,“更干净”的解决方案:
先决条件:您所有的模板都在某个地方定义为资源。
假设您在某处有一个包含以下内容的ResourceDictionary,用于测试:
<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,使用一个转换器将其绑定到当前对象本身
<DataTemplate>
<ContentControl ContentTemplate="{Binding Converter={StaticResource MyConverter}}" />
</DataTemplate>下面是转换器的样子(注意:这里的value对象是绑定对象,在本例中是使用它的类型,所以这个例子也是关于类型的)
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方法是我在了解这些模板选择器之前使用的方法,我现在不再使用它了
干杯!
https://stackoverflow.com/questions/12537658
复制相似问题