DataContext null для элементов управления 2-го окна - PullRequest
0 голосов
/ 12 октября 2018

У меня есть свойства 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, он показывает их все как ноль.

...