У меня есть свойства Window
, которые содержат TabControl
с несколькими TabItems
.Я хочу, чтобы у каждого TabItem
был свой ViewModel
.
Для начала у меня есть класс ViewModelLocator
.
public class ViewModelLocator
{
private MainViewModel _mainViewModel; //viewmodel for main window
public MainViewModel MainViewModel
{
get
{
if (_mainViewModel == null)
{
_mainViewModel = new MainViewModel();
}
return _mainViewModel;
}
}
private ExtentsViewModel _extentsViewModel; //viewmodel for one of my tab items
public ExtentsViewModel _ExtentsViewModel
{
get
{
if (_extentsViewModel == null)
{
_extentsViewModel = new ExtentsViewModel();
}
return _extentsViewModel;
}
}
}
ExtentsViewModel
- это DataContext
одного из моих TabItems
.
[AddINotifyPropertyChangedInterface]
public class ExtentsViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
ObservableCollection<ExtentModel> Extents
{
get;
set;
}
ExtentModel SelectedExtent { get; set; }
public ExtentsViewModel()
{
Extents = new ObservableCollection<ExtentModel>();
Extents.Add(new ExtentModel() { Name = "test1" });
Extents.Add(new ExtentModel() { Name = "test2" });
}
}
В моем App.xaml
я устанавливаю локатор в качестве ресурса:
<Application x:Class="WpfApp1.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApp1"
xmlns:vm="clr-namespace:WpfApp1.ViewModels"
StartupUri="MainWindow.xaml">
<Application.Resources>
<vm:ViewModelLocator x:Key="ViewModelLocator" />
</Application.Resources>
</Application>
Я запускаю окно свойств из кода моего главного окна, например:
private void ShowPropertiesBtn_Click(object sender, RoutedEventArgs e)
{
PropertiesWindow Properties = new PropertiesWindow();
Properties.ShowDialog();
}
И вот мойPropertiesWindow's xaml:
<Window x:Class="WpfApp1.Views.PropertiesWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp1.Views"
mc:Ignorable="d"
Title="OnyxProperties" Height="469.679" Width="606.269">
<Grid>
<TabControl HorizontalAlignment="Left" Height="386" VerticalAlignment="Top" Width="589">
<TabItem Name="TestTab" DataContext="{Binding Path=ExtentsViewModel, Source={StaticResource ViewModelLocator}}" Header="Extents">
<Grid Background="#FFE5E5E5">
<TextBlock Grid.Row="0" Grid.Column="1" Text="Extent Names" VerticalAlignment="Bottom"/>
<ListBox ItemsSource="{Binding Extents}" DisplayMemberPath="Name" Grid.Row="1" Grid.Column="1" Grid.RowSpan="6" />
В моем ExtentsModel
есть одно свойство:
public string Name
{
get;
set;
}
Итак, мои шаги: 1. Я создаю новую ExtentsViewModel в классе ViewModelLocator.
Я открываю новое окно PropertiesWindow из кода моего главного окна.
Мое PropertiesWindow содержит TabControl и TabItem в этом элементе управления, для которого DataContext установлен в мой ExtentsViewModel.
Затем я пытаюсь связать ItemsSource ListBox с коллекцией ExtentModels в моем ExtentsViewModel, при этом для DisplayMemberPath установлено единственное свойство в ExtentModel, которое равно «Name».
Примечание. Я использую Fody PropertyChanged.
Проверка DataContext
моего PropertiesWindow, а также TabItem
и ListBox
* DataContext
, он показывает их все как ноль.