C# 如何避免视图被处理

C# 如何避免视图被处理,c#,wpf,mvvm,C#,Wpf,Mvvm,我正在使用ContentControlim我的WPF应用程序向用户显示不同的视图 <ContentControl Content="{Binding CurrentPageViewModel}"/> 到目前为止还不错 每当切换视图时,我的问题就开始出现。然后丢弃旧视图,框架删除/处置视图对象 网格排序设置因此丢失,更糟糕的是,一些视图值被设置为null。空值通过数据绑定传播到我的ViewModel,这会彻底弄乱我的ViewModel数据 如何防止视图对象被删除/丢弃?控制视图寿命

我正在使用
ContentControl
im我的WPF应用程序向用户显示不同的视图

<ContentControl Content="{Binding CurrentPageViewModel}"/>
到目前为止还不错


每当切换视图时,我的问题就开始出现。然后丢弃旧视图,框架删除/处置视图对象

网格排序设置因此丢失,更糟糕的是,一些视图值被设置为null。空值通过数据绑定传播到我的ViewModel,这会彻底弄乱我的ViewModel数据


如何防止视图对象被删除/丢弃?

控制视图寿命的最简单但功能强大的解决方案是使用转换器而不是数据模板:

<ContentControl  Content="{Binding CurrentPageViewModel, Converter={StaticResource ViewModelToViewConverter}"/>
您需要设置IoC,以便对于特定视图的IoC,它将返回singleton实例。IoC还允许您在视图中添加依赖项。您可以使用自己的工厂模式实现来代替IoC


但是,当视图与visual Studio断开连接时,不应弄乱ViewModel属性。绑定中可能还有另一个问题,您应该提出新的问题,因为这不应该发生。视图将在MVVM中处理。所以你必须仔细看看为什么你会得到
null
值,而不是阻止视图被处理。@Sinatr:我在相关问题中问过这个问题。不幸的是,我没有得到真正的答案或解释。问题可能非常具体。这可能是一些控制/行为/事件问题(例如,它不能与绑定一起正常工作)。在属性what been
null
的setter中,检查
null
并在内部设置断点以查看堆栈调用(谁执行此操作以及原因)。应该可以在不让视图永久存在的情况下解决问题,例如,提前通知ViewModel视图已更改,并禁用setters逻辑。我自己使用的数据模板有很多视图,没有任何问题。视图模型数据在视图更改之间保留。我没有使用
数据网格
交互
(混合)。切换视图时会发生什么?您能否显示相关的ViewModel代码(谈论
CurrentPageViewModel
属性)。@Sinatr我确实按照建议设置了断点,但堆栈跟踪仅显示一个条目:“外部代码”。谢谢您的回答。这看起来不错。我已经就基本问题提出了另一个问题。
<ContentControl  Content="{Binding CurrentPageViewModel, Converter={StaticResource ViewModelToViewConverter}"/>
public class ViewModelToViewConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null) return null;

       //use naming convention or custom settings here to get view type
        var viewModelType = value.GetType();
        var viewType = ... 

        var view = (FrameworkElement) YourIocContainer.Resolve(viewType);
        view.DataContext = value;
        return view;
    }
    ...
 }