如何避免View被处理

时间:2015-07-30 09:44:20

标签: c# wpf mvvm

我正在使用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对象?

1 个答案:

答案 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属性。这可能是绑定中的另一个问题,你应该为这个

打开新的问题