如何避免View被处理

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

  

通过按下按钮,用户可以将CurrentPageViewModel的值切换到另一个ViewModel对象,并在DataTemplate的帮助下切换到另一个View

       

到现在为止还挺好。


切换视图时,我的问题就开始了。 然后丢弃旧的View ,框架删除/释放View对象。

因此网格排序设置丢失,更糟糕的是,某些视图值设置为空。 空值通过Databinding传播到我的ViewModel ,这完全混淆了我的ViewModel数据!

如何防止删除/丢弃View对象?

控制视图生命的最简单但非常强大的解决方案是使用转换器而不是datatemplates:

  
 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; } ... } 

您需要设置IoC,因此对于特定视图,它将返回单例实例。 IoC还允许您将dependency injection到您的视图中。 您可以使用自己的工厂模式实现而不是IoC。

但是,当视图与visual 3断开连接时,不应混淆ViewModel属性。 绑定中可能存在另一个问题,你应该为此开启新的问题