Expression Blend示例数据和DataTemplates

时间:2011-04-27 06:37:10

标签: c# wpf expression-blend

我正在使用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的内容。 我假设,这是因为样本数据函数生成的类虽然具有相同的属性等,但实际上并不是所需的类型。有办法吗?我更喜欢使用这种方式来集成示例数据,而不是在我的实际视图模型中包含所有这些无意义的数据。

2 个答案:

答案 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}" />

的工作原理。

我对这种方法并不满意,因为这是一项不必要的工作,依赖于魔法弦,但它总比没有好。