Как связать и изменить страницы в элементе управления вкладками с моделью представления? - PullRequest
0 голосов
/ 06 февраля 2012

У меня есть три страницы xaml и связанные ViewModels: main.xaml, MainViewModel.cs;page1.xaml, Page1ViewModel.cs;page2.xaml, page2ViewModel.cs.В main.xaml есть TabControl.Я хочу загрузить и показать page1.xaml в TabItem при инициализации приложения, а page1.xaml изменится на page2.xaml при нажатии кнопки, включенной в page1.xaml;page2.xaml будет изменен на page1.xaml при нажатии кнопки, включенной в page2.xaml.

Все события или команды должны быть реализованы во ViewModels.Мои вопросы:

  1. Как загрузить страницы в TabItem?
  2. Как изменить страницу в TabItem?

Выше были решены вопросыRachel, спасибо.

  1. Я хочу показать страницу1 и страницу2 в TabItem1, страница1 исчезнет, ​​а страница2 отобразится при нажатии кнопки, включенной в страницу 1.

Спасибо.

1 Ответ

1 голос
/ 06 февраля 2012

Ваш MainPageViewModel должен содержать коллекцию страниц, находящихся в TabControl, и SelectedPage. Он также должен содержать ICommand, который изменит текущую страницу.

Например,

// These should be full properties that raise PropertyChange notifications
public ObservableCollection<IPageViewModel> Tabs { get; set; }
public int SelectedTabIndex { get; set; }
private ICommand ChangeTabIndexCommand { get; set; }

MainPageViewModel()
{
    Tabs = new ObservableCollection<IPageViewModel>();

    Tabs.Add(new Page1ViewModel());
    Tabs.Add(new Page2VieWModel());

    SelectedTab = 0;

    ChangeTabIndexCommand = new RelayCommand<int>(ChangeTab);
}

void ChangeTab(int newIndex)
{
    if (newIndex >= 0 && newIndex < Tabs.Count())
        SelectedTab = newIndex;
}

Ваш MainView будет выглядеть так:

<TabControl ItemsSource="{Binding Tabs}" SelectedIndex="{Binding SelectedIndex}" />

Если вы используете Silverlight 5, я полагаю, что вы можете использовать неявный DataTemplates, однако если нет, вам придется использовать что-то вроде DataTemplateSelector или Converter, чтобы сообщить Silverlight, как рисовать каждую ViewModel. Я обычно использую Microsoft PRISM DataTemplateSelector

Есть несколько способов подключить ChangeTabIndexCommand. Я предпочитаю использовать какую-то систему обмена сообщениями , однако вы также можете подключить событие в конструкторе MainViewModel.

...