4

全体的に疑わしいコードの品質を持つ Silverlight プロジェクトを継承しました。

public SomeClass Self
{
    get
    {
        return this;
    }
}

これは XAML バインディングで使用され、パラメーターを使用して、次のように複雑になる場合があります。

Visibility="{Binding Self, ConverterParameter=!, Converter={StaticResource SmartAssConverter}}"

また、PropertyChanged 通知 (MVVM Light) で使用されます。

RaisePropertyChanged("Self");

それで、私がこれを行うのを妨げているものはありますか:

Visibility="{Binding ConverterParameter=!, Converter={StaticResource SmartAssConverter}}"

私がテストしたものは、まだ問題なく表示されますか?

私の質問を言い換えると、「プロパティを変更する」必要性は、この種の(私見醜い)構造を強制しますか?

編集:もう一度言い換えると、ターゲットが変更されたことをバインドされたコントロールに通知するためのよりエレガントなソリューションはありますか、それともコンバーターの作り直しを検討する必要がありますか?

4

3 に答える 3

2

オブジェクト (つまりSelf) が変更された場合はどうなりますか? プロパティを使用する場合Self、INotifyPropertyChanged インターフェイスを利用して、バインディングを更新するように指示できます。プロパティを削除した場合、どのように更新しますか?

を試すことはできますがRaisePropertyChanged(string.Empty)、うまくいかないと思います。

通常、コンバーターには、オブジェクト全体ではなく、必要なプロパティのみが渡されます。しかし、Silverlight には MultiBinding がないため、1 つのプロパティに制限されます。

コンバーターと同じ操作を実行する新しいプロパティをオブジェクトに追加するか、プロパティを追加する別のオブジェクトでラップすることができます。これは通常、ビューモデルの役割です。

于 2011-08-02T14:57:58.170 に答える
1

通常、IChangeTrackingおよびINotifyPropertyChangedインターフェイスを実装し、既定のコンストラクターで次のことを行います。

public SomeClass()
{
    this.PropertyChanged += new PropertyChangedEventHandler(OnNotifiedOfPropertyChanged);
}

private void OnNotifiedOfPropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e != null && !String.Equals(e.PropertyName, "IsChanged", StringComparison.Ordinal))
    {
        this.IsChanged = true;
    }
}

IsChangedプロパティはプロパティ変更通知を発生させるため、クラス自体を「Self」プロパティとして公開することなく、クラスが変更されたときに通知を受けるようにバインドできますIsChanged

于 2011-08-02T15:05:31.617 に答える
1

あなたが示したコードは少しぎこちなく見えますが、書き直す必要があるほど悪いとは思いません。そうです、パスを完全に削除できます。これは、バインディングの 1 回限りの評価で機能します。ただし、懸念される部分は、バインディングを再評価するために、コードが「Self」のプロパティ変更を発生させる場所です (素晴らしいハック...将来の使用のために覚えておきます!)

ここでの正しいアプローチは、DataContext 自体を変更することです。これは実質的に「自己」の変更であり、すべてのバインディングが再評価されます。

個人的には、私はこれにあまり時間をかけたくありません。

于 2011-08-02T15:06:42.650 に答える