如何在WPF MVVM中动态设置View的DataContext

时间:2013-06-05 13:25:06

标签: wpf data-binding mvvm tabcontrol

所以我对WPF和MVVM都很陌生,我在这里遇到TabControl问题并尝试在标签之间切换时保留数据。基本上我在视图中有一个TabControl,并且TabItems是根据用户交互动态加载和删除的。每个TabItem都是一个UserControl,它是自己的视图,具有自己的视图模型。

每次删除TabItem时(并不总是只是转到另一个选项卡,有时实际删除并重新创建选项卡)我正在保存其viewmodel的实例并保留数据但我在获取该数据时遇到问题重新创建选项卡时返回。我正在使用datatemplate来创建TabItems

<DataTemplate x:Key="MyView" DataType="{x:Type vm:MyViewModel}">
    <uc:MyView />
</DataTemplate>

并在TabControl中引用它。

<TabControl ItemsSource="{Binding ViewModelList, Mode=TwoWay}" 
            ContentTemplate="{StaticResource MyView}" 
            ItemTemplate="{StaticResource MyHeader}" 
            SelectedIndex="{Binding SelectedTabIndex, Mode=TwoWay}" />

所有内容都可以显示所有内容,但每次都会得到一个新的空白版本的UserControl。设置为ViewModelList的itemssource正是它的声音,我的viewmodel实例列表,用于保存每个选项卡的状态,以便可以重新创建它。这里的问题是这里使用的DataTemplate方法并没有真正给我一种方法来将我的viewmodel数据绑定到每次创建新TabItem时正在创建的视图的新实例。

我没有使用MVVMLight或Prism,但我确实有一个我尝试过使用的自定义EventAggregator。我遇到的问题是在正确的时间将数据传递给viewmodel的正确实例。我认为我的问题的一部分是MyViews datacontext在其代码隐藏构造函数中被设置为一个新的MyViewModel实例,它覆盖了我尝试传入的任何其他内容......

我只是不知道如何解决这个问题。我为这个冗长的问题道歉,但我想尝试覆盖一切。如果有人需要更多信息,请提前告知我们!

1 个答案:

答案 0 :(得分:2)

对此并不十分确定,但值得拍摄。我想,如果您修改DataTemplate之类的

<DataTemplate x:Key="MyView" DataType="{x:Type vm:MyViewModel}">
    <uc:MyView DataContext={Binding} />
</DataTemplate>

它可能会奏效。试试吧,让我知道。

好的,这很奇怪。来自MSDN

  
      
  • Items - 获取用于生成ItemsControl内容的集合。 (继承自ItemsControl。)
  •   
     

[...]

     
      
  • ItemsSource - 获取或设置用于生成ItemsControl内容的集合。 (继承自ItemsControl。)
  •   

您可能想尝试使用Items