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



我有一个接口IScreenViewModel,为了简化问题,我可以

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 类,它包含所有视图模型实例。屏幕视图模型,菜单视图模型等...因为我使用的是DevExpress,所以我无法直接在Main.xaml.cs文件中绑定DataContext,原因我还不知道。所以以主要为例。我不能有

ScreenLabel.DataContext  = viewModelWrapper.ScreenViewModel

我必须主要做:

DataContext  = viewModelWrapper;

这样,父窗口可以看到所有子元素。

在RedScreenView.xaml中,我可以有这样的东西:

<Label Background="ScreenViewModel.ScreenColor"/>

希望数据绑定应该在 ViewModelWrapper 中找到 IScreenViewModel.ScreenViewModel 对象,并使用动态绑定/多态性使用正确的 ScreenColor 对象。

在某些情况下,屏幕可以具有更多属性,因此请说GreenScreenViewModel以及继承的ScreenColor属性,它可以拥有自己的属性,也许DifferentProperty

问题是:我有一个工厂,它根据用户想要的屏幕返回屏幕对象。它返回正确的屏幕对象,但当它通知视图更新自身时,它会查看新对象,但使用了错误的 XAML。如果这有任何意义。我在ViewModelWrapper方法中做了这样的事情。

MainGui.ScreenWrapper.LayoutRoot.Clear() ;
MainGui.ScreenWrapper.Items.Clear() ;
MainGui.ScreenWrapper.LayoutRoot.Add(screenFactory.GetSelectedScreen("RedScreen").GetLayoutRoot()
    MainGui.UpdateLayout() ;
    ScreenViewModel = screenFactory.GetSelectedScreen("RedScreen").GetViewModel() ;

忽略我两次打电话给工厂的事实...ScreenWrapper 是保存屏幕的 LayoutGroup。当我使用该代码交换视图(屏幕)时,我希望它能使用正确的绑定。假设我从GreenScreenViewModel切换到RedScreenViewModel,记住GreenScreenViewModel比RedScreenViewModel多一个属性,在GreenScreenView中,我有这样的东西:

<Label Content="ScreenViewModel.DifferentProperty"/> 

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

编辑:在迈克尔感谢您的回复。是的,有一个实际的例外 - "NullReferenceException"在我正在使用的第三方dll中。那是因为它找不到属性。当我调用 OnPropertyChanged 时,它会引发异常,是的,处理程序不为空!我确定我没有说清楚,但也许问题应该是:从可视化树中删除和插入用户控件时,如何刷新可视化树以查看新绑定?如果我能刷新可视化树,它应该可以解决我的问题。UpdateLayout() 不起作用。

首先,你说

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

快递不应该是这里的问题。您需要绑定到的内容,这将返回相应的视图模型。请看这里关于这个主题的讨论。

其次,你说错误是

在视图中找不到属性 DifferentProperty ModelWrapper.ScreenModel

这不一定是问题,也不会引起异常。当您动态更改绑定时,INotifyPropertyChanged 事件会到处飞走,并且可能会有一段时间的"不确定性"。我假设您的视图模型实现了INotifyPropertyChanged。

我认为关键可能是仔细查看异常(如果有的话)(因为"找不到属性"是调试消息,而不是异常)。为了清楚起见,您可能需要关闭绑定消息,如此处所述。如果存在实际异常,请使用详细信息进行编辑。

最新更新