4

コンバーターを使用してパスのないバインディングがあります。これは、コンバーターがオブジェクトの多くのプロパティを使用してツールヒントのテキストを作成するためです。ただし、1 つのプロパティが変更された場合 (INotifyPropertyChanged が実装され、OnPropertyChanged が発生した場合)、このパスのないバインディングは更新されません。特定のプロパティにバインドされていないためだと思います。

更新する必要があることをどのように伝えるのですか?


私はより具体的にしようとしています:

バー オブジェクトには「開始」プロパティがあります。これを変更すると、バインディングが Start プロパティに直接取得されるため、バーが時間内に移動します。したがって、通知は単一のプロパティに対して機能します。ただし、ツールチップ バインディングは{Binding Converter={StaticResource TooltipConverter}}特定のプロパティにバインドされますが、バインドされません。「開始」が変更されると、バーは移動しますが、tooltipconverter が再度呼び出されないため、ツールヒントは更新されません。

バーは 内の 1 つのオブジェクトObservableCollection<Bar>です。バーはコレクションまたはビュー モデルを示す必要がありますか? 通常、それとは何の関係もありません。

4

3 に答える 3

7

考えられる回避策の 1 つを次に示します。

次のように、オブジェクトにItSelfプロパティ (または他の名前) を付けます。

public Object ItSelf
{
    get { return this; }
}

縛る代わりに

{Binding Converter={StaticResource TooltipConverter}}

使用する

{Binding ItSelf, Converter={StaticResource TooltipConverter}}

次にOnPropertyChanged、すべてのプロパティに対して ''ItSelf'' をレイズします。したがって、オブジェクトがバインディングで使用されたときはいつでも、オブジェクト全体の更新を通知できます。

public DateTime Start
{
    get { return this.start; }
    set { this.start = value; OnPropertyChanged("Start"); OnPropertyChanged("ItSelf");
}

これは少し速く動作するようになりましたがAttachedBehavior、@AnatoliiG が述べたようにこれをテストしたいので、後で回答を受け入れます。

于 2013-11-13T13:50:00.820 に答える
0

INotifyPropertyChangeデータ型クラスにインターフェイス実装すると、クラス プロパティへの変更の通知が処理されます。INotifyPropertyChangeクラスの型のプロパティを持つビュー モデル クラスにインターフェイスを実装すると、そのプロパティ (この場合はオブジェクト全体) への変更が通知されます。


更新 >>>

そうです...あなたは type のプロパティを持っていると思いますObservableCollection<Bar>PropertyChanged各項目にハンドラーを追加すると...:

foreach (Bar item in YourCollectionProperty) item.PropertyChanged += 
Item_PropertyChanged;

...次に、これを行うことができます:

private void Item_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    NotifyPropertyChanged("YourCollectionProperty");
}
于 2013-11-13T10:28:59.313 に答える
0

明確にするためDataTemplateに、コレクション内のアイテムにいくつかあります。商品の種類は ですBarItemsSource親リストはBarオブジェクトのコレクションです。Bar特定のオブジェクトのプロパティが変更された場合にツールチップを変更したい。

問題は、特定のパスバインディングを指定していない場合、変更通知をサブスクライブすることDataContextですBar。したがって、オブジェクト内の変更や通知は気にしません。
バブリングを実装して、変更されたイベントが親オブジェクトにルーティングされるようにすることもできますがChanged、そのようなものには別のプロパティを定義することをお勧めします。

public bool StateChanged
{
   get { return true; }
}

クラス内でイベントをサブスクライブしPropertyChangedます。

this.PropertyChanged += PropertyChangedHandler;

ハンドラーで、オブジェクトの状態が変化したことを通知します。

private void PropertyChangedHandler(object sender, PropertyChangedEventArgs e)
{
    if  (!e.PropertyName.Equals("StateChanged"))
    {
        this.OnPropertyChanged("StateChanged");
    }
}
于 2013-11-13T11:31:13.913 に答える