2

WPF バインディングで厄介な問題が発生しています。基本的に、UserControl のリソースで FrameworkElement を宣言しますが、親の UserControl の DataContext が変更されたときに、その項目が通知されないようです。

基本的に、私の UserControl には、ItemsControl の ItemTemplate に 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 を設定します。

CollectionViewSource がこれを行う方法を確認するために Reflector を調べましたが、特別なことはしていないようです。

なぜこれが起こっているのか、どうすれば修正できるのか誰にも分かりますか?

4

2 に答える 2

2

私は同じ問題を抱えていて、解決策を見つけました。

まず、ViewModelをルート要素のDataContextとして設定しようとしました。間違い。

次に、ViewModelをリソースとして設定し、ルート要素のバインディングソースをリソースに設定しようとしました。間違い。

最後に、モデル(魔女はコントロールのDataContext)をViewModelに変換するIValueConverterを作成しました。次に、ルート要素の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 に答える