3

現時点で表示するテキストがない場合は非表示にする小さな視覚的インジケーター (境界線のあるテキストブロックのみ) を実装しました。テキストはIndicatorプロパティにバインドされており、データ コンテキストは正しく設定されているようです。

これまでに得たものは次のとおりです(インジケーターテキストが表示され、非表示/表示は機能しません):

<Border>
    <Border.Style>
        <Style TargetType="{x:Type Border}">
            <Setter Property="Visibility" Value="Visible"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=Indicator.Length}" Value="0">
                    <Setter Property="Visibility" Value="Hidden"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Border.Style>
    <TextBlock Text="{Binding Indicator}" />
</Border>

私の問題は、テキストの長さがゼロの場合、要素が非表示にならないことです。

あなたは私の間違いを見つけますか?

Indicator は対応するビューモデルの一部です:

public string Indicator
{ get; set;}

アップデート

上記のプロパティを次のように変更すると機能します。

public const string IndicatorPropertyName = "Indicator";
private string _indicator = "";
public string Indicator
{
    get
    { return _indicator;}

    set
    {
        if (_indicator == value) { return;}

        RaisePropertyChanged(IndicatorPropertyName);
    }
}

PropertyChanged イベントを発生させた場合にのみ機能するのはなぜですか?

4

2 に答える 2

4

名前が示すように、トリガーはイベントが発生したときにのみ実行または状態をチェックすると思います。DataTriggerの場合、それはPropertyChangedインターフェースの-EventですINotifyPropertyChanged

イベントを発生させない限り、DataTriggerは、バインディングをチェックする必要があること、および値がトリガー条件を満たしているかどうかを認識しません。

于 2012-12-03T10:37:37.830 に答える
2

あなたのソース バインディングはIndicatorプレーンな CLR プロパティです。

WPF は、データ バインディングに大きく基づいています。内部で変更通知が発生するため、バインディング ソースが変更されると、バインドされたオブジェクトが自動的に更新されます。依存関係プロパティ (WPF のみが理解するプロパティ タイプ) にバインドする場合、バインドされたオブジェクトの変更通知が既に組み込まれています。余分な作業は必要ありません。

プレーン CLR プロパティにバインドすることもできますが、この場合、バインドされたオブジェクトに対する組み込みの変更通知はありません。プログラムで変更通知を実装する必要があります。これは、PropertyChangedイベントを発生させることによって行われます。その CLR プロパティにバインドされたオブジェクトは、値の変更が通知され、自身を更新します。

INotifyPropertyChangedつまり、CLR プロパティでターゲット バインディングを更新する場合は、PropertyChanged イベントを実装して発生させる必要があります。

于 2012-12-03T11:36:07.940 に答える