如何避免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属性。 绑定中可能存在另一个问题,你应该为此开启新的问题