2

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

基本上,在我的用户控件中,我在 ItemTemplate 中有一个用于 ItemsControl 的弹出窗口。在那个 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 是如何做到这一点的,但它似乎并没有做任何特别的事情。

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

4

2 回答 2

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 破坏元素中的绑定时,当数据上下文在根元素上发生更改时,它会在破坏的绑定上停止。

于 2010-08-06T12:09:46.500 回答
1

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

于 2011-01-09T12:59:01.043 回答