我有一个属性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的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.我在ViewModelLocator类中创建了一个新的ExtentsViewModel。
我从后面的主窗口代码中打开一个新的PropertiesWindow。
我的PropertiesWindow在该控件内包含一个TabControl和一个TabItem,其DataContext设置为我的ExtentsViewModel。
然后,我尝试将ListBox的ItemsSource绑定到我的ExtentsViewModel中的ExtentModels集合,并将DisplayMemberPath设置为ExtentModel中的唯一属性,即“名称”。
注意:我正在使用Fody PropertyChanged。
检查我的PropertiesWindow的DataContext
以及TabItem
和ListBox
的{{1}},将它们全部显示为空。