Примеры данных Expression Blend и шаблонов данных - PullRequest
4 голосов
/ 27 апреля 2011

Я использую функцию «Выборка данных из класса» Expression Blend для генерации выборочных данных для моих ViewModels в моем проекте MVFM WPF. Несмотря на то, что в большинстве случаев это работает нормально, мне кажется, что я не могу использовать ContentPresenter для представления модели представления, и шаблон DataTemplate, который он должен использовать, не имеет ключа, а только DataType. Вместо рендеринга примеров данных с использованием шаблона, он просто отображает имя класса с префиксом.

В качестве примера возьмем эту ViewModel

public class TestClass
{
    public string TestString { get; set; }
}

этот шаблон данных

<DataTemplate DataType="{x:Type my:TestClass}" >
    <TextBlock Text="{Binding TestString}" />
</DataTemplate>

и этот XAML

<ContentPresenter Content="{Binding MyPropertyContainingATestClass}" />

Теперь во время выполнения все должно быть, но во время разработки Blend вместо содержимого TestString показывает «_di0.MyNameSpace.TestClass». Я предполагаю, что это потому, что классы, сгенерированные функцией образца данных, имеющие одинаковые свойства и т. Д., На самом деле не имеют требуемого типа. Есть ли способ обойти это? Я бы предпочел использовать этот способ для интеграции образцов данных, и не иметь все эти бессмысленные данные в моих реальных моделях представления.

Ответы [ 2 ]

1 голос
/ 28 апреля 2011

Мне кажется, проблема в том, что у вас есть DataTemplate, а не ContentTemplate. Попробуйте обернуть DataTemplate в ContentTemplate, как показано в этой статье: http://msdn.microsoft.com/en-us/library/system.windows.controls.contentcontrol.contenttemplate.aspx

Прошу прощения за то, что не успел его проверить.

0 голосов
/ 28 апреля 2011

Возможный обходной путь - использование DataTemplateSelector, который выбирает шаблон на основе имен классов, а не их типов.

Изменение шаблона данных на

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

работает.

Я не очень доволен этим подходом, так как это много ненужной работы и зависит от волшебных струн, но это лучше, чем ничего.

...