Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用MVVM Light的WPF:如何将ContentControl绑定到子属性_C#_Wpf_Xaml_Data Binding_Mvvm Light - Fatal编程技术网

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

那么我做错了什么

这是省略的代码。我希望我没有把任何错误,因为我现在不在工作,不能测试

My
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();
    }
    }
}
虚拟
视图模型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>