我正在使用Expression Blend的“Sample data from class”功能为我的MVVM WPF项目中的ViewModel生成示例数据。虽然这在大多数情况下工作正常,但是当我使用ContentPresenter来呈现视图模型时,它似乎失败了,它应该使用的DataTemplate没有Key,只有DataType。 它不是使用模板渲染样本数据,而是显示带有前缀的类名称。
举个例子,拿这个ViewModel
public class TestClass
{
public string TestString { get; set; }
}
此DataTemplate
<DataTemplate DataType="{x:Type my:TestClass}" >
<TextBlock Text="{Binding TestString}" />
</DataTemplate>
和这个XAML
<ContentPresenter Content="{Binding MyPropertyContainingATestClass}" />
现在,在运行时,一切都应该是,但在设计过程中Blend显示“_di0.MyNameSpace.TestClass”而不是TestString的内容。 我假设,这是因为样本数据函数生成的类虽然具有相同的属性等,但实际上并不是所需的类型。有办法吗?我更喜欢使用这种方式来集成示例数据,而不是在我的实际视图模型中包含所有这些无意义的数据。
答案 0 :(得分:1)
我认为问题在于您拥有DataTemplate而不是ContentTemplate。尝试将DataTemplate包装在ContentTemplate中,如本文所示: http://msdn.microsoft.com/en-us/library/system.windows.controls.contentcontrol.contenttemplate.aspx
我为没有时间测试而道歉。
答案 1 :(得分:0)
一种可能的解决方法是使用DataTemplateSelector,它根据类名而不是类型来选择模板。
将DataTemplate更改为
<DataTemplate x:Key="TestClassTemplate" DataType="{x:Type my:TestClass}" >
<TextBlock Text="{Binding TestString}" />
</DataTemplate>
创建DataTemplateSelector
public class TestTemplateSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(
object item,
DependencyObject container)
{
FrameworkElement element = container as FrameworkElement;
if (element == null || item == null)
return null;
if (item.GetType().Name.Contains("TestClass"))
return element.FindResource("TestClassTemplate") as DataTemplate;
// Check for other classes here...
return null;
}
}
并使用它
<!-- in ressources -->
<local:TestTemplateSelector x:Key="TestTemplateSelector" />
<ContentPresenter Content="{Binding MyPropertyContainingATestClass}"
ContentTemplateSelector="{StaticResource TestTemplateSelector}" />
的工作原理。
我对这种方法并不满意,因为这是一项不必要的工作,依赖于魔法弦,但它总比没有好。