获取WPF资源中更改的DataContext的通知

时间:2010-05-11 18:43:26

标签: wpf binding collectionviewsource

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

基本上,在我的UserControl中,我在ItemTemplate中有一个用于ItemsControl的Popup。在那个Popup中,我需要绑定到父视图的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是如何做到这一点的,但它似乎并没有做任何特别的事情。

任何人都知道为什么会这样或者我如何解决它?

2 个答案:

答案 0 :(得分:2)

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

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

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

最后,我创建了一个IValueConverter,将Model(控件的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在根元素上发生更改时,它会在损坏的绑定上停止。

答案 1 :(得分:1)

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