【问题标题】:DataContext binding数据上下文绑定
【发布时间】:2016-05-23 21:55:35
【问题描述】:

我拥有的是三种不同的观点。我有每个视图的视图模型。我所做的是将视图的数据上下文设置为相应视图模型的新实例,其工作方式如下所示:

public LoginScreen()
        {
            InitializeComponent();
            DataContext = new LoginScreenViewModel();
        }

这可以按需要工作。一切都正确绑定等等。

现在,我将每个视图都设置为 UserControl。我的 Window 包含每个视图的数据模板,如下所示:

<Window.Resources>
        <DataTemplate DataType="{x:Type vm:LoginScreenViewModel}">
            <v:LoginScreen/>
        </DataTemplate>
        <DataTemplate DataType="{x:Type vm:MainWindowViewModel}">
            <v:MainWindow/>
        </DataTemplate>
        <DataTemplate DataType="{x:Type vm:AboutScreenViewModel}">
            <v:AboutScreenView/>
        </DataTemplate>
    </Window.Resources>

我这样显示视图:

 <Grid>
        <ContentControl Content="{Binding CurrentView}"/>
 </Grid>

这允许我在窗口的视图模型中创建视图模型,将它们设置为 CurrentView,并且与该视图模型关联的视图显示在窗口中。这一切正常。

我的问题是,如果我切换视图,存储在视图的 ViewModel 中的所有信息都会被破坏。我的问题是,如何将每个视图的数据上下文绑定到创建它的视图模型,而不是绑定到后面代码中的新实例?

【问题讨论】:

  • 不要使用 new() 实例化您的 ViewModel,而是尝试使用 SimpleIoC 或其他框架来创建您的 ViewModel 类的单例

标签: c# wpf xaml mvvm datacontext


【解决方案1】:

我想你在这里有点困惑。您无需为您的views 显式创建DataContext(s)。当您的ViewModel 定义您的视图时,它也会传递给您的View,因为它是DataContext

不要明确分配DataContext 并尝试检查 DataContext 加载后的视图。它将是ViewModel 这实际上导致 view 加载。

例如如果您的视图是LoginScreen,您的DataContext 将是vm:LoginScreenViewModel。在 LoginScreen 加载后,您无需创建 vm:LoginScreenViewModel 的新对象并将其分配给 view。

【讨论】:

  • 哇。那很简单。我想这很容易。刚刚从后面的代码中删除了数据上下文,它工作得很好。谢谢大佬。
【解决方案2】:

您最好从视图模型中实例化您的视图。在您的 CurrentView 内容控件所在的任何位置实例化视图模型,并将 Content 属性设置为包含在视图模型中的视图。这样就不会在您每次切换视图时重新创建它们。

【讨论】:

    猜你喜欢
    • 2015-07-04
    • 2013-01-04
    • 2016-04-28
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多