【问题标题】:Get notified of DataContext changed in a WPF Resource获取有关 WPF 资源中 DataContext 更改的通知
【发布时间】:2011-02-18 07:14:18
【问题描述】:

我在使用 WPF 绑定时遇到了一个烦人的问题。基本上,我在 UserControl 的资源中声明了一个 FrameworkElement,但是当父 UserControl 的 DataContext 更改时,该项目似乎没有得到通知。

基本上,在我的 UserControl 中,我在 ItemTemplate 中有一个用于 ItemsControl 的弹出窗口。在那个弹出窗口中,我需要绑定到父视图的 ViewModel 中的某些东西,所以我想出了一个我认为很聪明的技巧。从 CollectionViewSource 中得到启发,我想我只需将我父母的视图模型绑定到一个资源,然后使用该资源从 DataTemplate 获取 ViewModel,如下所示:

    <UserControl.Resources>
        <cont:ViewModelSource Source="{Binding}" x:Key="ParentViewModel"/>
    </UserControl.Resources>

这样以后我可以像这样使用它:

CommandParameter="{Binding ViewModel.OpenEntity, Source={StaticResource ParentViewModel}}"

这一切似乎都可以工作除了,当 UserControl 的 DataContext 被重置时,ViewModelSource 上的 DataContext 不会被重置。现在,我正在巧妙地完成这项工作:在 UserControl 的 DataContextChanged 事件的代码隐藏中设置资源的 DataContext。

我查看了 Reflector 以了解 CollectionViewSource 是如何做到这一点的,但它似乎并没有做任何特别的事情。

有人知道为什么会发生这种情况或我该如何解决吗?

【问题讨论】:

    标签: wpf binding collectionviewsource


    【解决方案1】:

    也许你必须创建一个实现INotifyPropertyChanged 接口的中间对象。

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,我找到了解决方案。

      首先我尝试将我的 ViewModel 设置为我的根元素的 DataContext。错了。

      然后我尝试将我的 ViewModel 设置为资源并将我的根元素的绑定源设置为资源。错了。

      最后我创建了一个 IValueConverter 来将一个模型(女巫是控件的 DataContext)转换为一个 ViewModel。然后我将根元素的 DataContext 与转换器绑定。

      <UserControl.Resources>
      
          <local:PersonToControllerConverter x:Key="PersonToControllerConverter"/>
      
          <!--<local:PersonController x:Key="controller"
              Value="{Binding}"
              Parent="{Binding Path=DataContext,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeViewItem}}}"
              />-->
      
      </UserControl.Resources>
      
      
      
      <Border x:Name="root" BorderBrush="Black" BorderThickness="2" >
          <Border.DataContext>
              <MultiBinding Converter="{StaticResource PersonToControllerConverter}">
                  <Binding/>
                  <Binding Path="DataContext" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeViewItem}}"/>
              </MultiBinding>
          </Border.DataContext>
      
          <!--DataContext="{Binding Source={StaticResource controller}}">-->
      
          <!--<Border.DataContext>
              <local:PersonController
                          Value="{Binding}"
                          Parent="{Binding Path=DataContext,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeViewItem}}}"
                          />
          </Border.DataContext>-->
      

      我认为,当 DataContext 破坏元素中的绑定时,当根元素上的 datacontext 发生变化时,它会在断开的绑定处停止。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-18
        • 1970-01-01
        • 1970-01-01
        • 2013-04-27
        • 1970-01-01
        • 1970-01-01
        • 2012-09-30
        • 1970-01-01
        相关资源
        最近更新 更多