У меня странная проблема с моим 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()
{
}
}