WPF 在XXView.xaml中设置了ContentControl,ContentControl绑定的界面竟然不显示

217 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

在WPF中会经常使用到MVVM框架:

  1. Model、View和ViewMode之间的关系:View和ViewModel是如何联系起来(IOC)以及如何通信(通常采用Message),ViewModel和mode之间的弱关联(通常采用接口或简单注入)。
  2. 事件驱动模式在MVVM模式采用Command和Attached Behaviours的形式。
  3. 属性及ViewModel的NotifyPropertyChanged处理。
  4. 提供完整的单元测试,这也是保证框架的稳定性和维护性的保证。

问题描述

WPF 在XXView.xaml中设置了ContentControl,ContentControl绑定的界面竟然不显示???
按照正常逻辑编写了代码,运行的时候竟然出现了这个问题,不慌,我们一步一步来看

首先给大家看一下我之前是怎么给ContentControl绑定界面的。

代码复现

1、XXView.xaml

在XXView.xaml的ContentControl添加名称为XX-XX"的子界面

......	//这部分内容我就先省略了
<ContentControl x:Name="XX-XX"/>

2、XXViewModel.cs

在XXViewModel.cs中处理XX-XX

public class XXViewModel : Screen
{
	//属性
	public XX-XXViewModel XX-XX
	{
		get{return _xX-XX;}
		set
		{
			_xX-XX = value;
			NotifyOfPropertyChange(()=>XX-XX);
		}
	}
	public XX-XXViewModel _xX-XX;
	
	//在后续定义的方法中操作XX-XX
	public void Func()
	{
		......
		if(...)
		{
			XX-XX = new XX-XXViewModel();
		}
		else
		{
			XX-XX = null;
		}
		......
	}
}

这样一波操作后,运行程序子界面竟然不显示。😓(lll¬ω¬)

解决方案

刚出现的问题很有可能是没有给ContentControl绑定上值,所以就再换一种方式重新绑定一下。

1、XXView.xaml

在XXView.xaml的ContentControl添加名称为XX-XX"的子界面

......	//这部分内容我就先省略了
<ContentControl x:Name="XX-XX" Content="{Binding XX-XX}"/>

2、XXViewModel.cs

在XXViewModel.cs中处理XX-XX

public class XXViewModel : Screen
{
	//属性
	public XX-XXView XX-XX
	{
		get{return _xX-XX;}
		set
		{
			_xX-XX = value;
			NotifyOfPropertyChange(()=>XX-XX);
		}
	}
	public XX-XXView _xX-XX;
	
	//在后续定义的方法中操作XX-XX
	public void Func()
	{
		......
		if(...)
		{
			XX-XX = new XX-XXView();
			XX-XX.DataContext = new XX-XXViewModel();	//在这里还需要处理一下界面的上下文
		}
		else
		{
			XX-XX = null;
		}
		......
	}
}

好了,界面就显示出来了,开心。