簡體   English   中英

使用MVVM Light的WPF:如何將ContentControl綁定到子屬性

[英]WPF using MVVM Light: How to bind a ContentControl to a child property

我正在嘗試實現一個中介類ViewModelSelector ,該中介類設置並選擇要在主視圖主窗口MainView.xaml顯示的當前View / ViewModel。 我正在嘗試通過在MainView.xaml內為ViewModel1 (參見下文)定義一個DataTemplate,然后使用一個ContentControl來綁定到ViewModelSelector CurrentViewModel屬性。 ViewModelSelector分配ViewModel1其財產CurrentViewModel 然后的想法是使用更多的DataTemplates和ViewModels擴展它,並使用UserControls來設置ViewModelSelector並確定要顯示哪個ViewModel( ViewModel1ViewModel2等)。 但是由於某種原因,這是行不通的:

當ContentControl中結合ViewModelSelector.CurrentViewModel使用<ContentControl Content="{Binding ViewModelSelector.CurrentViewModel}"/>的DataTemplate中未示出(見MainView.xaml下文)。 但是沒有拋出其他錯誤(我可以告訴)。

出於調試目的,我還在MainViewModel.cs創建了CurrentViewModelInMainViewModel屬性,將其設置為ViewModelSelector.CurrentViewModelCurrentViewModelInMainViewModel = 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>

答案是一個簡單的編程錯誤。 我在這里重寫MainViewModel.cs的構造函數中的ViewModelSelector屬性: ViewModelSelector ViewModelSelector = new ViewModelSelector();

將該行更改為ViewModelSelector = new ViewModelSelector(); 現在可以正常工作了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM