2011-04-27 57 views
4

我正在使用Expression Blend的“示例数据来自类”功能为我的MVVM WPF项目中的ViewModels生成示例数据。虽然这在大多数情况下都能正常工作,但当我使用ContentPresenter呈现视图模型时,它似乎失败了,并且它应该使用的DataTemplate没有Key,但只有一个DataType。 而不是使用模板呈现示例数据,它只是显示具有前缀的类名称。Expression Blend示例数据和数据模板

举个例子,借此视图模型

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

可能的解决方法是使用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}" /> 

作品。

我对这种方法并不满意,因为这是很多不必要的工作,并且依赖于魔法字符串,但它总比没有好。

1

我认为问题是你有一个DataTemplate而不是一个ContentTemplate。尝试将DataTemplate包装在ContentTemplate中,如本文所示: http://msdn.microsoft.com/en-us/library/system.windows.controls.contentcontrol.contenttemplate.aspx

对于没有时间测试它,我表示歉意。

+0

感谢您的回复。不过,链接的文章并未解决我的情况。我希望避免在Presenter上设置ContentTemplate。当我为不同类型使用不同的DataTemplates时,ContentPresenter在运行时自动选择正确的一个。请参阅http://msdn.microsoft.com/en-us/library/ms742521.aspx#Styling_DataType – Jens 2011-04-28 06:41:55