2012-02-06 12 views
0

私は3つのxamlページと関連するViewModelsを持っています:main.xaml、MainViewModel.cs; page1.xaml、Page1ViewModel.cs; page2.xaml、page2ViewModel.cs。 main.xamlにはTabControlがあります。 アプリケーションを初期化するときにTabItemにpage1.xamlをロードして表示し、page1.xamlに含まれるボタンをクリックするとpage1.xamlがpage2.xamlに変更されます。 page2.xamlに含まれるボタンをクリックすると、page2.xamlがpage1.xamlに変更されます。viewmodelでタブコントロールのページをバインドして変更するにはどうすればいいですか?

ViewModelsですべてのイベントまたはコマンドを実装する必要があります。私の質問:

  1. ページをTabItemにロードするには?
  2. TabItemでページを変更するにはどうすればよいですか?

上記の質問はレイチェル氏によって解決されました。

  1. TabItem1でshow page1とpage2を表示すると、page1に含まれるボタンをクリックするとpage1が表示され、page2が表示されます。

ありがとうございます。

答えて

1

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は次のようになります。あなたはSilverlightの5を使用している場合、私はあなたが持っているでしょうがない場合は、暗黙的DataTemplates使用することができると信じて

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

DataTemplateSelectorまたはConverterのようなものを使用して、Silverlightに各ViewModelの描画方法を伝えます。私は通常使用しますMicrosoft PRISM'sDataTemplateSelector

ChangeTabIndexCommandを接続する方法はいくつかあります。私の好みは、ある種のMessaging Systemを使用することですが、MainViewModelのコンストラクターでイベントを接続することもできます。

+0

レイチェル、あなたの答えに感謝します。また、TabItemに別のページを表示する方法と、同じタブアイテムに別のページを読み込むために、メインページではなくページ内にイベントincudeを公開する方法についての質問もあります。ありがとう。 – zclmoon

関連する問題