主应用程序窗口,减去大量不相关的代码。
<Window>
<Window.Resources>
<DataTemplate DataType="{x:Type presenters:DashboardViewModel}">
<views:DashboardView />
</DataTemplate>
<DataTemplate DataType="{x:Type presenters:SecondViewModel}">
<views:SecondView />
</DataTemplate>
</Window.Resources>
<ContentPresenter Content="{Binding WindowPresenter}"/>
</Window>
绑定到 Window 的视图模型
public class RootViewModel {
// IRL this implements notifypropchanged
public IPresenter WindowPresenter {get; set;}
public void ShowDashboard(){ this.WindowPresenter = new DashBoardViewModel(); }
public void ShowSecond(){ this.WindowPresenter = new SecondViewModel(); }
}
DashboardView
并且SecondView
是具有许多依赖属性的用户控件,这些依赖属性绑定到各自视图模型中的属性。
// example of a common dependency property I have
public static readonly DependencyProperty ColorPaletteProperty = DependencyProperty.Register("ColorPalette", typeof(ColorPalette), typeof(SurfaceMapControl), new PropertyMetadata(ColorPalette.Rainbow, new PropertyChangedCallback(SurfaceMapControl.ColorPalettePropertyChanged)));
private static void ColorPalettePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { ((SurfaceMapControl)d).OnColorRangeChanged(); }
private void OnColorRangeChanged() {
// code that uses this.SomeOtherDependencyProperty
// throws null ref exception
}
调用ShowDashboard()
时,内容呈现器显示正确的用户控件并且所有属性都正确绑定。在调用 时ShowSecond()
,内容呈现器显示正确的用户控件并且所有属性都正确绑定。
有时,在两个视图之间切换时,我会在其中一个用户控件的依赖属性中得到空引用异常,因为我的一些属性会查看其他依赖属性。这让我相信视图模型在视图之前被垃圾收集,并且视图模型中的更改触发了 usercontrols 依赖属性,这反过来又引发了异常,因为视图模型不再存在。
我可以防止在视图模型被处置时触发依赖属性吗?
或者是否有必要在每个依赖属性中进行空数据上下文检查?
我应该在这里包含一些东西来查看用户控件的生命周期以完全防止这种情况吗?