使用MVVM Light的WPF:如何将ContentControl绑定到子属性
我试图实现一个中介类ViewModelSelector
,它设置并选择当前的View/ViewModel作为主视图主窗口MainView.xaml
的一部分显示。我试图通过在MainView.xaml
内定义ViewModel1
(见下文)的DataTemplate,然后使用我绑定到ViewModelSelector
的属性CurrentViewModel
的ContentControl
来完成此操作。 ViewModelSelector
将ViewModel1
分配给其属性CurrentViewModel
。这个想法是用更多的DataTemplates和ViewModels来扩展它,并使用UserControl来设置ViewModelSelector
并决定显示哪个ViewModel(ViewModel1
,ViewModel2
等)。但由于某些原因,这不起作用:使用MVVM Light的WPF:如何将ContentControl绑定到子属性
使用<ContentControl Content="{Binding ViewModelSelector.CurrentViewModel}"/>
将ContentControl绑定到ViewModelSelector.CurrentViewModel
时,未显示数据模板(请参见下面的MainView.xaml
)。但没有其他错误(我可以告诉)。
为了调试的目的,我还在MainViewModel.cs
中创建了CurrentViewModelInMainViewModel
属性,我设置为ViewModelSelector.CurrentViewModel
(CurrentViewModelInMainViewModel = ViewModelSelector.CurrentViewModel;
)。直接绑定到它(<ContentControl Content="{Binding CurrentViewModelInMainViewModel}"/>
),并显示DataTemplate。
那么我做错了什么?
这里是被忽略的代码。我希望我没有把任何错误的话,因为我在工作中是不是现在并不能测试...
我MainViewModel.cs
:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ProgramEditor.ViewModel
{
using GalaSoft.MvvmLight;
using ProgramEditor.View;
class MainWindowViewModel : ViewModelBase
{
private ViewModelSelector ViewModelSelector;
public ViewModelSelector ViewModelSelector
{
get { return ViewModelSelector; }
set {
ViewModelSelector = value;
RaisePropertyChanged("ViewModelSelector");
}
}
private ViewModelBase currentViewModelInMainViewModel;
public ViewModelBase CurrentViewModelInMainViewModel
{
get
{
return currentViewModelInMainViewModel;
}
set
{
if (currentViewModel == value)
return;
currentViewModelInMainViewModel = value;
RaisePropertyChanged("CurrentViewModelInMainViewModel");
}
}
public MainWindowViewModel()
{
ViewModelSelector ViewModelSelector = new ViewModelSelector();
CurrentViewModelInMainViewModel = ViewModelSelector.CurrentViewModel;
}
}
}
类ViewModelSelector
:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ProgramEditor.ViewModel
{
using GalaSoft.MvvmLight;
class ViewModelSelector : ViewModelBase
{
public ViewModelBase CurrentViewModel
{
get { return currentViewModel; }
set
{
if (currentViewModel == value)
return;
currentViewModel = value;
RaisePropertyChanged("CurrentViewModel");
}
}
private ViewModelBase currentViewModel;
public ViewModelSelector()
{
CurrentViewModel = new ViewModel1();
}
}
}
伪ViewModel1
:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ProgramEditor.ViewModel
{
using GalaSoft.MvvmLight;
public class ViewModel1 : ViewModelBase
{
}
}
<DataTemplate DataType="{x:Type ViewModel:FirstViewModel}">
<TextBlock Text="There be dragons here." FontSize="50"/>
</DataTemplate>
我MainView.xaml
:
<Window x:Class="ProgramEditor.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:view="clr-namespace:ProgramEditor.View"
xmlns:ViewModel="clr-namespace:ProgramEditor.ViewModel"
Title="MainWindow" Height="900" Width="1600">
<Window.Resources>
<DataTemplate DataType="{x:Type ViewModel:ViewModel1}">
<TextBlock Text="There be dragons here." FontSize="50"/>
</DataTemplate>
</Window.Resources>
<StackPanel>
<!-- This works (shows up in main window): -->
<ContentControl Content="{Binding CurrentViewModelInMainViewModel}"/>
<!-- This does not work (does not show up in main window): -->
<!--<ContentControl Content="{Binding ViewModelSelector.CurrentViewModel}"/>-->
</StackPanel>
</Window>
答案是一个微不足道的编程错误。我重写ViewModelSelector
财产的MainViewModel.cs
这里的构造函数:ViewModelSelector ViewModelSelector = new ViewModelSelector();
改变该行ViewModelSelector = new ViewModelSelector();
现在按预期工作后。
我的启示:总是发布完整的代码的另一个原因,因为我没有在问题的原始版本中的片段。 – packoman
什么是'ViewModelMediator'?什么意思*“不”*起作用?例外?黑屏? – Sinatr
属性路径语法通常起作用。但是,如果你使用不正确,它不会。不幸的是,您只提供了一个不完整的,不可编译的代码示例和一个模糊的,不完整的问题描述。请改善问题。请参阅[mcve]了解有关良好代码示例的信息。 –
好的。我重提了这个问题。我认为这足以自我解释,并假设有人更熟悉WPF会直接发现错误。我希望问题现在更清楚。 – packoman