4

プロパティとそのオブジェクトのプロパティにバインドされているコントロールを持つオブジェクトがあるとしましょう。そのオブジェクトが変更されるとどうなりますか?

たとえば、ViewModel:

public class TheViewModel : INotifyPropertyChanged
{
        private TheObjectClass theObject;
        public TheObjectClass TheObject
        {
            get { return theObject; }
            set { theObject = value; 
                  OnPropertyChanged("TheObject"); }
        }
}

オブジェクトのクラス:

public class TheObjectClass : INotifyPropertyChanged
{
        private ThePropertyClass theProperty;
        public ThePropertyClass TheProperty
        {
            get { return theProperty; }
            set { theProperty= value; 
                  OnPropertyChanged("TheProperty"); }
        }
}

プロパティのクラス:

public class ThePropertyClass : INotifyPropertyChanged
{
        private object objectToBindTo;
        public object ObjectToBindTo
        {
            get { return objectToBindTo; }
            set { objectToBindTo= value; 
                  OnPropertyChanged("ObjectToBindTo"); }
        }
}

次に、ウィンドウ(ViewModelがDataContextとして設定されている)に、次のようにこのオブジェクトにバインドするコントロールがあります。

<TextBlock Text={Binding TheObject.TheProperty.ObjectToBindTo}/>

次に、ViewModel.TheObjectをどこかでリセットします(バインドが行われた後)。

ViewModel.TheObject = new TheObjectClass();

私のテストでは(特にこのコードではなく、私のアプリケーションのコードの単純化された例です)、バインディングが存続することもあれば、機能しなくなることもあるようです。ここで何が起こると思いますか?親オブジェクトが別のオブジェクトにインスタンス化されると、プロパティバインディングが壊れることは論理的に思えますが、存続しているように見えることがあり、これは本当に混乱を招きます。

4

1 に答える 1

7

一般に、これはサポートされている操作であり、バインドは常に「存続」する必要があります。WPF バインディング システムは、 のプロパティ変更通知を確認しTheObject、バインディングを新しいサブオブジェクトにリセットする必要があります。

null実際には、バインディングが存続しない場合もありますが、これは通常、チェーンに沿った 1 つのオブジェクトが になり、バインディングが壊れる時点があるためです。1 つのオブジェクトが になるとnull、WPF は効果的にPropertyChanged呼び出しからサブスクライブを解除し (リッスンするオブジェクトがないため)、新しい値が設定されるのを決して見ないため、それが機能しなくなる可能性があります。

于 2013-02-28T02:04:20.917 に答える