C# 使用UpdateLayout或其他替代方法刷新视图数据绑定

C# 使用UpdateLayout或其他替代方法刷新视图数据绑定,c#,wpf,data-binding,devexpress,C#,Wpf,Data Binding,Devexpress,我有一个界面IsScreenViewModel,为了简化这个问题,我可以 RedScreenViewModel : IScreenViewModel GreenScreenViewModel : IScreenViewModel 等等。。 这意味着我有一个RedScreenView.xaml,它生成一个RedScreenViewModel实例,同样适用于所有后续的彩色屏幕 IScreenViewModel has some properties that you must implement

我有一个界面IsScreenViewModel,为了简化这个问题,我可以

RedScreenViewModel : IScreenViewModel
GreenScreenViewModel : IScreenViewModel
等等。。 这意味着我有一个RedScreenView.xaml,它生成一个RedScreenViewModel实例,同样适用于所有后续的彩色屏幕

IScreenViewModel has some properties that you must implement e.g. 
interface IScreenViewModel
{
   public Color ScreenColor{get;set;}
}
我有一个ViewmodelWrapper类,它保存所有viewmodels实例。屏幕视图模型、菜单视图模型等。。。 因为我使用的是DevExpress,所以我无法在Main.xaml.cs文件中直接绑定DataContext,原因我还不知道。 例如,主要是这样。 我不能

ScreenLabel.DataContext  = viewModelWrapper.ScreenViewModel
我主要要做的是:

DataContext  = viewModelWrapper;
这样,父窗口可以看到所有子元素

在RedScreenView.xaml中,我可以有如下内容:

<Label Background="ScreenViewModel.ScreenColor"/>
忽略我给工厂打了两次电话的事实。。。 ScreenWrapper是保存屏幕的LayoutGroup。当我使用该代码交换视图屏幕时,我希望它使用正确的绑定。 假设我从GreenScreenView模型切换到RedScreenViewModel,还记得GreenScreenView模型比RedScreenViewModel多了一个属性吗?在GreenScreenView中,我有这样的东西:

<Label Content="ScreenViewModel.DifferentProperty"/> 
当交换完成并且ScreenViewModel通知现在指向RedScreenViewModel时,它抛出一个异常。我强烈认为这是因为布局没有被刷新,它仍然使用错误的视图。 调试模式下的输出错误为 在viewModelWrapper.ScreenModel中找不到属性DifferentProperty 这是不对的,因为我已经删除了GreenScreenView,我更新了布局,我知道有一个LayoutChanged事件或类似的事情,所以可能也会被提出,为什么它仍然看到错误的视图? 如何更新ScreenWrapper.LayoutRoot以查看具有不同绑定代码的新视图。 天哪,我希望那是清楚的。 编辑:迈克尔,谢谢你的回复。是的,在我使用的第三方dll中有一个实际的异常-NullReferenceException。那是因为它找不到财产。我确信我没有说清楚,但问题应该是:当从可视化树中删除和插入用户控件时,如何刷新可视化树以查看新绑定?如果我可以刷新可视化树,它应该可以解决我的问题。UpdateLayout不起作用

编辑: 谢谢你的回复。是的,在我使用的第三方dll中有一个实际的异常-NullReferenceException。那是因为它找不到财产。当我调用OnPropertyChanged时,它抛出异常,是的,处理程序不是null! 我确信我没有说清楚,但也许问题应该是: 从可视化树中删除和插入usercontrols时-如何刷新可视化树以查看新绑定?如果我可以刷新可视化树,它应该可以解决我的问题。 UpdateLayout不起作用

首先,你说

因为我使用的是DevExpress,所以我无法在Main.xaml.cs文件中直接绑定DataContext,原因我还不知道

这里的问题不应该是快递。您需要绑定到将返回相应ViewModel的对象。看看关于这个问题的讨论

第二,你说错误是

在viewModelWrapper.ScreenModel中找不到属性DifferentProperty

这不一定是问题,也不会导致异常。动态更改绑定时,INotifyPropertyChanged事件会四处飞散,可能会有一段时间的“不确定性”。我假设您的视图模型实现INotifyPropertyChanged


我认为关键可能是仔细查看异常,如果存在异常,因为找不到属性是调试消息,而不是异常。为了更清楚,您可能需要关闭绑定消息,如下所述。如果存在实际的异常,请编辑详细信息。

我编辑问题是为了表明它确实引发了实际的期望。我认为我使用的第三方dll要求属性必须存在,因此如果引用中不存在与RedScreenViewModel中不存在的不同属性,那么它会抛出nullreferenceexception消息。当我打电话给物业公司时
<Label Content="ScreenViewModel.DifferentProperty"/>