第二个窗口控件的DataContext null

时间:2018-10-12 00:58:11

标签: wpf mvvm viewmodel datacontext viewmodellocator

我有一个属性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。

  1. 我从后面的主窗口代码中打开一个新的PropertiesWindow。

  2. 我的PropertiesWindow在该控件内包含一个TabControl和一个TabItem,其DataContext设置为我的ExtentsViewModel。

  3. 然后,我尝试将ListBox的ItemsSource绑定到我的ExtentsViewModel中的ExtentModels集合,并将DisplayMemberPath设置为ExtentModel中的唯一属性,即“名称”。

注意:我正在使用Fody PropertyChanged。

检查我的PropertiesWindow的DataContext以及TabItemListBox的{​​{1}},将它们全部显示为空。

0 个答案:

没有答案