[英]Bind DataGrid in WPF to child navigation property (EF) with 1:1 using MVVM
[英]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( ViewModel1
, ViewModel2
等)。 但是由於某種原因,這是行不通的:
當ContentControl中結合ViewModelSelector.CurrentViewModel
使用<ContentControl Content="{Binding ViewModelSelector.CurrentViewModel}"/>
的DataTemplate中未示出(見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>
答案是一個簡單的編程錯誤。 我在這里重寫MainViewModel.cs
的構造函數中的ViewModelSelector
屬性: ViewModelSelector ViewModelSelector = new ViewModelSelector();
將該行更改為ViewModelSelector = new ViewModelSelector();
現在可以正常工作了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.