WPF ContentPresenter не работает с одной записью в ResourceDictionary - PullRequest
0 голосов
/ 04 сентября 2018

У меня странная проблема с моим ContentPresenter. В моем стандартном приложении WPF у меня есть «TestView», «TestViewModel», «MainWindowView» и «MainWindowViewModel». MainWindowView содержит ContentPresenter, содержимое которого связано с ViewModelProperty объекта MainWindowViewModel:

<ContentPresenter DockPanel.Dock="Right"
                  Height="Auto"
                  Width="Auto"
                  Content="{Binding CurrentContentViewModel}" />

И ViewModel:

private IViewModel _currentContentViewModel;
public IViewModel CurrentContentViewModel
{
    get
    {
        return  _currentContentViewModel;
    }
    set
    {
        _currentContentViewModel = value;
        OnPropertyChanged();
    }
 }

TestView привязан к TestViewModel в моем App.xaml:

<Application.Resources>
    <ResourceDictionary >
        <DataTemplate DataType="{x:Type viewModel:TestViewModel}">
            <view:TestView />
        </DataTemplate>
    </ResourceDictionary>
</Application.Resources>

Когда я теперь назначаю экземпляр TestViewModel для CurrentContentViewModel, ContentPresenter показывает имя класса TestViewModel:

MainWindowViewModel mainWindowViewModel = new MainWindowViewModel();
MainWindowView mainWindowView = new MainWindowView(mainWindowViewModel);

TestViewModel testViewModel = new TestViewModel();

mainWindowView.Show();
mainWindowViewModel.CurrentContentViewModel = testViewModel;

Как я решил проблему? Я добавил пустой тег стиля, определение SolidColorBrush или что-то еще в свой ResourceDictionary:

<Application.Resources>
    <ResourceDictionary >
        <DataTemplate DataType="{x:Type viewModel:TestViewModel}">
            <view:TestView />
        </DataTemplate>

        <SolidColorBrush x:Key="ColorBrushDummy" Color="HotPink"/>

    </ResourceDictionary>
 </Application.Resources>

Теперь все в порядке, и ContentPresenter показывает TestView.

А теперь мой вопрос: Почему?

Edit:

Я создал новый SampleProject и воспроизвел ошибку. Проблема возникает, когда я начал использовать метод OnStartup моего App.xaml.cs:

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);

    MainWindowViewModel mainWindowViewModel = new MainWindowViewModel();
    MainWindowView mainWindowView = new MainWindowView(mainWindowViewModel);

    TestViewModel testViewModel = new TestViewModel();

    mainWindowView.Show();
    mainWindowViewModel.CurrentContentViewModel = testViewModel;
}

My TestView:

<UserControl x:Class="ErrorSample.TestView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:ErrorSample"
         mc:Ignorable="d" 
         d:DesignHeight="450"
         d:DesignWidth="800"
         d:DataContext="{d:DesignInstance local:TestViewModel}">
<Grid Background="Red">
        <TextBlock Text="{Binding Text}"
                   VerticalAlignment="Center"
                   HorizontalAlignment="Center"/>
</Grid>

Моя TestViewModel:

public class TestViewModel : ViewModelBase
{
    public string Text { get; } = "Sample Text";
}

И моя MainWindowViewModel:

public class MainWindowViewModel : ViewModelBase
{
    private IViewModel _currentContentViewModel;

    public IViewModel CurrentContentViewModel
    {
        get => _currentContentViewModel;
        set
        {
            _currentContentViewModel = value;
            OnPropertyChanged();
        }
    }

    public MainWindowViewModel()
    {

    }
}
...