C# 使用MVVM Light的WPF:如何将ContentControl绑定到子属性
我正在尝试实现一个中间类C# 使用MVVM Light的WPF:如何将ContentControl绑定到子属性,c#,wpf,xaml,data-binding,mvvm-light,C#,Wpf,Xaml,Data Binding,Mvvm Light,我正在尝试实现一个中间类ViewModelSelector,该类设置并选择当前视图/视图模型,以显示为主视图主窗口MainView.xaml。我试图通过在MainView.xaml中为ViewModel1(见下文)定义一个数据模板,然后使用一个ContentControl,我将其绑定到ViewModelSelector的属性CurrentViewModel。ViewModelSelector将ViewModel1分配给其属性CurrentViewModel。然后,我们的想法是通过更多的数据模板和
ViewModelSelector
,该类设置并选择当前视图/视图模型,以显示为主视图主窗口MainView.xaml
。我试图通过在MainView.xaml
中为ViewModel1
(见下文)定义一个数据模板,然后使用一个ContentControl
,我将其绑定到ViewModelSelector
的属性CurrentViewModel
。ViewModelSelector
将ViewModel1
分配给其属性CurrentViewModel
。然后,我们的想法是通过更多的数据模板和视图模型来扩展它,并使用用户控件设置ViewModelSelector
并决定显示哪个视图模型(ViewModel1
,ViewModel2
,等等)。但是,由于某些原因,这不起作用:
使用
将ContentControl绑定到ViewModelSelector.CurrentViewModel
时,不会显示数据模板(请参见下面的MainView.xaml
)。但是没有抛出其他错误(我可以说)
出于调试的目的,我还在MainViewModel.cs
中创建了一个CurrentViewModelInInviewmodel
属性,并将其设置为ViewModelSelector.CurrentViewModel
(CurrentViewModelInInviewmodel=ViewModelSelector.CurrentViewModel;
)。直接绑定到它(
)起作用,并显示DataTemplate
那么我做错了什么
这是省略的代码。我希望我没有把任何错误,因为我现在不在工作,不能测试
MyMainViewModel.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();
}
}
}
虚拟视图模型1
:
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>
答案是一个微不足道的编程错误。我在这里重写了
MainViewModel.cs
的构造函数中的ViewModelSelector
属性:ViewModelSelector ViewModelSelector=new ViewModelSelector()代码>
将该行更改为ViewModelSelector=newviewmodelselector()代码>它现在按预期工作。什么是ViewModelMediator
?“不”是什么意思?例外?空白屏幕?属性路径语法正常工作。但是如果你用错了,它就不会。不幸的是,您只提供了一个不完整的、甚至不可编译的代码示例和一个模糊的、不完整的问题描述。请改进这个问题。有关良好代码示例的信息,请参见。Ok。我回答了这个问题。我认为这是非常自明的,并假设更熟悉WPF的人会直接发现错误。我希望问题现在更清楚了。我的启示是:这只是始终发布完整代码的另一个原因,因为我在问题的原始版本中没有这个片段。
<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>