我正在使用ContentControl
我的WPF应用程序向用户显示不同的视图。
<ContentControl Content="{Binding CurrentPageViewModel}"/>
通过按下按钮,用户可以将CurrentPageViewModel
的值切换到另一个 ViewModel 对象,并在DataTemplate
的帮助下切换到另一个视图。
<DataTemplate DataType="{x:Type viewModel:AdministrationViewModel}">
<view:AdministrationView />
</DataTemplate>
<DataTemplate DataType="{x:Type viewModel:HealthViewModel}">
<view:HealthView />
</DataTemplate>
到目前为止一切顺利。
我的问题会在视图切换时启动。然后,旧的 View 将被丢弃,Framework将删除/部署 View 对象。
网格排序设置因此丢失,更糟糕的是,某些 Views 值设置为null。空值通过Databinding传播到我的 ViewModel ,这完全混淆了我的 ViewModel 数据!
如何阻止删除/丢弃View对象?
答案 0 :(得分:4)
最简单但非常强大的解决方案来控制您的观点&#39;生活使用转换器而不是数据模板:
<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;
}
...
}
您需要设置IoC,以便在特定视图中返回单例实例。 IoC还允许您将依赖注入到您的视图中。您可以使用自己的工厂模式实现而不是IoC。
但是,当视图与visual 3断开连接时,不应混淆ViewModel属性。这可能是绑定中的另一个问题,你应该为这个
打开新的问题