Изменение части представления во время выполнения - PullRequest
2 голосов
/ 23 января 2012

Я показываю несколько элементов фильма в ObservableCollection, используя типичный список + представление таблицы данных.Однако на той же странице я хочу, чтобы можно было быстро изменить представление на то, что я определяю для представления плаката (т. Е. Только изображения постеров в обертке).

Страница xaml использует модель представления в качестве текстового контекста.

Есть ли способ в основном заменить часть содержимого XAML другой?И все же сохраняйте как можно меньше кода в коде позади представления.

Я видел примеры WPF, в которых, например, используется DataTrigger, связанный с очень чистым viewmodelproperty, например, this article ... но Windows Phone не имеет DataTriggers, верно?

Я пытаюсь использовать подход MVVM-ish, поэтому требуется как можно меньше кода в представлении кода.

Итак, я хочу изменить это:

<ContentControl DataContext="{Binding CinemaShowsOverview }" Template="{StaticResource ListView}" />

Кому:

<ContentControl DataContext="{Binding CinemaShowsOverview }" Template="{StaticResource PosterView}" />

Ответы [ 2 ]

4 голосов
/ 23 января 2012

DataTemplates с DataTemplateSelector могли бы решить эту проблему.

Селектор шаблонов базовых данных:

public class DataTemplateSelector : ContentControl
{
    public virtual DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        throw new NotImplementedException();
    }

    protected override void OnContentChanged(object oldContent, object newContent)
    {
        base.OnContentChanged(oldContent, newContent);

        ContentTemplate = SelectTemplate(newContent, this);
    }
}

Специализированный селектор шаблонов для CinemaShowsOverview

public class CinemaShowsTemplateSelector : DataTemplateSelector
{
    public DataTemplate ListTemplate
    {
        get;
        set;
    }

    public DataTemplate PosterTemplate
    {
        get;
        set;
    }

    public DataTemplate DefaultTemplate
    {
        get;
        set;
    }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        if (item == null)
            return DefaultTemplate;

        var viewModel = item as CinemaShowsOverview;
        if (viewModel != null)
            return viewModel.IsPoster ? PowerTemplate : ListTemplate;
        else
            return DefaultTemplate;
    }
}

А затем в XAML (заменяя ваш текущий ContentControl):

<assets:CinemaShowsTemplateSelector PosterTemplate="{StaticResource PosterView}"
                                    ListTemplate="{StaticResource ListView}"
                                    Content="{Binding CinemaShowsOverview}">
0 голосов
/ 23 января 2012

Просто чтобы быть педантичным, блог, о котором вы упоминаете, описывает типизированные шаблоны данных, а не наборы данных (как их классифицирует автор).Нет, эта функция недоступна в Silverlight для WP7.

Вы можете представить нужный шаблон в виде строки в вашей модели представления, то есть в виде строки ListView или PosterView.Затем вы привязываете свое свойство Template к этому свойству модели представления через преобразователь значений, который предоставляет шаблон, к которому он может получить доступ через ваши приложения Resources.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...