Различные представления / пользовательские элементы управления на каждой вкладке TabControl - PullRequest
5 голосов
/ 25 августа 2011

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

Моя проблема в том, что я не уверен, как настроить это в моей программе. Я создал TabControl и связал ItemsSource с коллекцией моделей представления (к которым я могу добавлять всякий раз, когда пользователь добавляет новый экран). Я могу использовать DataTemplateSelector, чтобы выбрать DataTemplate, который содержит правильное представление, но я не знаю, как установить ресурс представления для моей модели представления.

Я делаю это в WPF, и в настоящее время я использую Bxf, чтобы поместить мои view-модели в представления, и это обычно работает, но я не уверен, как это вписывается в TabControl.

Я пытаюсь придерживаться MVVM, поэтому отсутствует список представлений в моей модели представления.

Кто-нибудь делал что-то подобное раньше?

Ответы [ 2 ]

16 голосов
/ 25 августа 2011

Я бы сделал так, чтобы моя основная ViewModel выглядела так:

  • ObservableCollection<ViewModelBase> OpenTabs
  • ICommand AddTabCommand
  • ICommand CloseTabCommand

В конструкторе, новый SearchViewModel создается и добавляется к OpenTabs, а его метод Search получает подключения к некоторому методу в MainViewModel

Метод в MainViewModel, который обрабатывает команду поиска, создаст новый CustomerViewModel с указанным клиентом, установит его CloseCommand, а затем добавит его к OpenTabs

var vm = new CustomerViewModel(customer);
vm.CloseCommand = this.CloseTabCommand;
OpenTabs.Add(vm);

Вы также можете использовать систему событий, такую ​​как PRISM EventAggregator или Galasoft Messenger, для передачи событий AddTab / CloseTab вместо подключения команд из MainViewModel

И, конечно, вы бы использовали DataTemplates, чтобы определить, как каждый объект OpenTab будет отображаться в представлении

<TabControl ItemsSource="{Binding OpenTabs}">
    <TabControl.Resources>
        <DataTemplate DataType="{x:Type local:SearchViewModel}">
            <local:SearchView />
        </DataTemplate>
        <DataTemplate DataType="{x:Type local:CustomerViewModel}">
            <local:CustomerView />
        </DataTemplate>
    </TabControl.Resources>
</TabControl>
0 голосов
/ 29 августа 2011

Я только что ответил на свой вопрос.

Табличные элементы, которые создаются динамически, устанавливаются с помощью datacontext отдельного элемента из свойства источника tabcontrols, в данном случае одной из моих моделей представления.

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

Тем не менее, мое представление установило datacontext сетки в представлении для моего ресурса, поэтому ничего не показывалось. Я изменил это, чтобы использовать datacontext вместо ресурса, и теперь все работает.

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

...