MVVM для приложения на основе tabcontrol - PullRequest
1 голос
/ 07 ноября 2011

В моем приложении wpf главное представление имеет 5 вкладок с 5 различными пользовательскими элементами управления, поскольку пользовательские элементы управления не связаны друг с другом, я создал 5 различных моделей представления (кроме основной модели представления).

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

Например, если у меня есть одна вкладка, которая будет связана с пользовательским контролем, я могу назначить

 tab1View tview=new tab1View();
 tview.DataContext= new tab1ViewModel();
 tab1.Content=tview;

Но как я могу сделать то же самое из списка, который имеет ссылку напросмотреть и просмотреть модели пользовательских элементов управления?

Пожалуйста, научите меня, как лучше всего этого достичь.

** Ответ: **

Я получил ответ на то, что мне нужно.Во-первых, необходимо создать коллекцию универсальных типов моделей представлений C # - Несколько универсальных типов в одном списке

public abstract class Metadata
{
}

public class Metadata<DataType> : MetaData where DataType : class
{
private DataType mDataType;
}
List<Metadata> metadataObjects;
metadataObjects.Add(new Metadata<tab1ViewModel>());
metadataObjects.Add(new Metadata<tab2ViewModel>());

Затем создайте селектор DataTemplate, если необходимо создать несколько представленийссылается на ту же модель представления или просто применяет DataTemplate

Ответы [ 2 ]

5 голосов
/ 07 ноября 2011

Есть несколько способов справиться с этим, хотя я бы посмотрел на использование фреймворков, чтобы помочь вам с MVVM.Я сам продвигаю Prism .

Просмотр инъекций


Просмотр Discovery


DataTemplates - Образец

С DataTemplates вы определяете в XAML (или в коде, но XAML являетсяболее вероятно), какое представление «автоматически» применяется к ContentControl на основе модели представления (DataContext).

Где-то в ресурсах XAML:

<DataTemplate DataType="{x:Type ViewModel:GeneralSettingsViewModel}">
    <View:GeneralSettingsView/>
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModel:AdvancedSettingsViewModel}">
    <View:AdvancedSettingsView/>
</DataTemplate>

Где-то в XAMLфайл, к которому применены ресурсы:

 <TabControl ItemsSource="{Binding MyViewModelCollection}" />

Примечание. Это работает, только если у вас есть одна модель представления на шаблон данных в ресурсе с заданной областью.


DataTemplateSelector

Если у вас есть модель представления, которую можно применить к нескольким представлениям, и вы определяете эти представления с помощью дополнительной логики, вам следует использоватьDataTemplateSelector.Вот пример:

Где-то в ресурсах XAML:

<!-- Possible collision because the DataType is of the same type -->
<DataTemplate x:Key="GeneralSettingsTemplate"
              DataType="{x:Type ViewModel:SettingsViewModel}">
    <View:GeneralSettingsView/>
</DataTemplate>
<DataTemplate x:Key="AdvancedSettingsTemplate"
              DataType="{x:Type ViewModel:SettingsViewModel}">
    <View:AdvancedSettingsView/>
</DataTemplate>
<local:SettingsDataTemplateSelector x:Key="SettingsTemplateSelector"
    GeneralSettingsTemplate="{StaticResource GeneralSettingsTemplate}"
    AdvancedSettingsTemplate="{StaticResource AdvancedSettingsTemplate}" />

Где-то в файле XAML, к которому применены ресурсы:

<TabControl ItemsSource="{Binding MyViewModelCollection}"
            ItemTemplateSelector="{StaticResource SettingsTemplateSelector}" />

SettingsTemplateSelector.cs:

public class SettingsDataTemplateSelector : DataTemplateSelector
{
    public DataTemplate GeneralSettingsTemplate { get; set; }
    public DataTemplate AdvancedSettingsTemplate { get; set; }

    public override DataTemplate SelectTemplate(Object item,
        DependencyObject container)
    {
        var vm = item as SettingsViewModel;

        if (vm == null) return base.SelectTemplate(item, container);

        if (vm.IsAdvanced)
        {
            return AdvancedSettingsTemplate;
        }

        return GeneralSettingsTemplate;
    }
}

MSDN: навигация по призме - http://msdn.microsoft.com/en-us/library/gg430861(v=PandP.40).aspx
Это охватывает регионы Prism, а также другие части навигации.

MSND: просмотр Discovery vsView Injection - http://msdn.microsoft.com/en-us/library/ff921075(v=pandp.20).aspx
В этом разделе рассматриваются различия между View Discovery и View Injection, и когда их использовать.

2 голосов
/ 07 ноября 2011

Создайте коллекцию ваших моделей представления, которые вы привязываете к ItemsSource элемента управления вкладкойЗатем создайте DataTemplateSelector, чтобы выбрать представление для каждой модели представления.

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