、これは私がそれを行うだろうかです:
まず、TabControlの各タブを表すすべてのビューモデルによって継承されるBaseViewModelクラスを作成します。
"Title"という抽象的な文字列プロパティを持つ抽象クラスとして実装したいので、動的にタブを作成してその名前(またはタイトル)を表示できます。このクラスは、NotifyPropertyChangedインタフェースも実装します。
public abstract class BaseViewModel : INotifyPropertyChanged
{
public abstract string Title { get; }
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
次に、このベースビューモデルから継承した各ビューモデルを作成します。
public class NameViewModel : BaseViewModel
{
public override string Title
{
get
{
return "Name";
}
}
}
他のビューモデルでも同様の操作を行い、それぞれの「タイトル」プロパティを変更します。
ここでは、アプリケーションのMainViewとそれに対応するビューモデルを作成します。
MainViewModelがBaseViewModelsの収集と「CurrentViewModel」(タイプのBaseViewModel)を持っているだろうと、このように、そのコンストラクタにそのコレクションにしたいすべてのビューモデルを追加します。
最後に
public class MainViewModel : BaseViewModel
{
public override string Title
{
get
{
return "Main";
}
}
private ObservableCollection<BaseViewModel> _viewModels;
public ObservableCollection<BaseViewModel> ViewModels
{
get { return _viewModels; }
set
{
if (value != _viewModels)
{
_viewModels = value;
OnPropertyChanged();
}
}
}
private BaseViewModel _currentViewModel;
public BaseViewModel CurrentViewModel
{
get { return _currentViewModel; }
set
{
if (value != _currentViewModel)
{
_currentViewModel = value;
OnPropertyChanged();
}
}
}
public MainViewModel()
{
ViewModels = new ObservableCollection<BaseViewModel>();
ViewModels.Add(new NameViewModel());
ViewModels.Add(new CodeViewModel());
ViewModels.Add(new FactorDetailViewModel());
}
}
、 (1)TabControlのDisplayMemberPathをBaseViewModelsの "Title"プロパティに設定する必要があります。また、(2)BaseViewModelsの "Title"プロパティにDisplayMemberPathを設定する必要があります。 )WindowのDataContextをMainViewModelに設定する必要があります)
<Window ...>
<Window.DataContext>
<local:MainViewModel/>
</Window.DataContext>
<Grid>
<TabControl Name="TCMain"
ItemsSource="{Binding ViewModels}"
DisplayMemberPath="Title"
SelectedItem="{Binding CurrentViewModel}"
Background="#00FFFFFF" BorderThickness="0" Padding="0 -5 0 0 ">
<TabControl.ContentTemplate>
<DataTemplate>
<ContentControl Content="{Binding}">
<ContentControl.Resources>
<DataTemplate DataType="{x:Type local:NameViewModel}">
<local:NameView />
</DataTemplate>
<DataTemplate DataType="{x:Type local:CodeViewModel}">
<local:CodeView />
</DataTemplate>
<DataTemplate DataType="{x:Type local:FactorDetailViewModel}">
<local:FactorDetailView />
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
</Grid>
</Window>
これは期待どおりに動作するはずです。 TabControlのアクティブなタブを変更するたびに、コントロールのSelectedItemプロパティが対応するビューモデルに変更され、対応するビューとしてテンプレート化されます。
この方法は、(最初の表示ではなく)「モデルの最初の表示」と呼ばれます。私はあなたがいると仮定し
:
EDITは
あなたは、現在のビューモデルを変更するコマンドを持つビューモデルのいずれかのボタンを持っているしたい場合は、これはあなたがそれを行う方法ですJosh SmithのRelayCommandに精通しています。そうでない場合は、ウェブ上でその実装を検索してください。
あなたは「CurrentViewModel」プロパティを変更する責任があるであろう、あなたのMainViewModel上のICommandプロパティを作成する必要があります。
private ICommand _showFactorDetailCommand;
public ICommand ShowFactorDetailCommand
{
get
{
if (_showFactorDetailCommand == null)
{
_showFactorDetailCommand = new RelayCommand(p => true, p => show());
}
return _showFactorDetailCommand;
}
}
private void show()
{
CurrentViewModel = ViewModels.Single(s => s.Title == "Factor");
}
ショーを()上記の方法は、単純に持つビューモデルのコレクションを検索"Factor"というタイトルをCurrentViewModelに設定します。CurrentViewModelは、メインビュー内のTabControlのContentTemplateとして機能するContentControlのコンテンツになります。
次のようにあなたのFactorDetailViewModelが実施されるべきであることに注意してください:
public class FactorDetailViewModel : ViewModelBase
{
public override string Title
{
get
{
return "Factor";
}
}
}
あなたの「NameView」内のボタンは、バインディングRelativeSourceを使用して「MainViewModel」のプロパティで、このコマンドにバインドされます:
<Button Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.ShowFactorDetailCommand}" Content="Show Factor" Height="20" Width="60"/>
を
このコマンドをより一般的にすると、ナビゲートしたいビューモデルのタイトルをコマンドパラメータとして渡すことができます。
あなたの意見に続いて3210
、あまりにコマンドパラメータを渡す:
<Button Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.ShowCommand}" Content="Show Factor" CommandParameter="Factor" Height="20" Width="60"/>
は最後に、完全にあなたのTabItemsを隠すために、あなたはあなたのTabItemsの可視性は、の値を持つようにあなたのTabControlのItemContainerStyleを設定する必要があります"Collapsed"
これは、タブビューモデルをメインビューモデルのリストプロパティに追加する必要があり、 'TabControl.ItemsSource'がそのプロパティにバインドされている必要があります。場合によっては、あなたのサンプルコードから明らかではありません。 –
私はそれでした:) – mm8
TabControl.ItemsSourceはObservableCollectionに設定する必要があります。 Tの代わりに何を置き換えることができますか?ビューモデルは同じではありません。 –
Farshad