2

PropertyGridを拡張するコントロールがあり、ユーザーがいくつかのプログラムオブジェクトのプロパティを設定できるようになっています。これらのオブジェクトには、プロパティの1つが変更されたときに発生するイベントがあり、PropertyGridはこのイベントをサブスクライブして、プロパティが変更されたときに自身を更新します。私の問題は、多数のオブジェクトが選択され、ユーザーがすべてのオブジェクトに一度にプロパティを設定したときに発生します。コントロールはRefresh()リクエストでいっぱいになりますが、これには長い時間がかかります(たとえば、自動更新機能をオンにすると、最大300個のオブジェクトにプロパティを設定するのに約20秒かかり、オンにするとほんの一瞬です。オフ)。

プロパティグリッドがプロパティを設定しているときにイベントハンドラーがグリッドを更新しないようにしたいのですが、残念ながら、グリッドの設定がいつ「開始」および「停止」するかを判断する方法が見つかりませんでした。プロパティ。私は、次のようなメソッドやオーバーライドできるものがあることを望んでいました...

override void OnSetPropertyStart()
{
    suppressRefresh = true;
}
override void OnSetPropertyEnd()
{
    suppressRefresh = false;
}

残念ながら、これは当てはまらないようです。プロパティグリッドがプロパティを設定している時期を判断する方法、またはこれと同じ効果を実現する方法は他にありますか?

4

1 に答える 1

1

タイプはあなたの管理下にありますか?FooUpdating/FooUpdatedペアのイベントを追加できますか?もう1つのオプションは、を使用してカスタムプロパティモデルを作成することTypeDescriptionProviderですが、これはかなりの作業になると思います。私の最初の試みは、ビフォー/アフターペアです...

次のようなもの(3.5のアプローチを示すように更新されました。2.0の例については履歴を参照してください):

class MyType : INotifyPropertyChanged, INotifyPropertyChanging
{
    public event PropertyChangedEventHandler PropertyChanged;
    public event PropertyChangingEventHandler PropertyChanging;

    protected void UpdateField<T>(ref T field, T newValue, string propertyName)
    {
        if (!EqualityComparer<T>.Default.Equals(field, newValue))
        {
            OnPropertyChanging(propertyName);
            field = newValue;
            OnPropertyChanged(propertyName);
        }
    }
    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this,
            new PropertyChangedEventArgs(propertyName));
    }
    protected void OnPropertyChanging(string propertyName)
    {
        PropertyChangingEventHandler handler = PropertyChanging;
        if (handler != null) handler(this,
            new PropertyChangingEventArgs(propertyName));
    }
    private string name;

    public string Name
    {
        get { return name; }
        set { UpdateField(ref name, value, "Name"); }
    }
    private DateTime dateOfBirth;
    public DateTime DateOfBirth
    {
        get { return dateOfBirth; }
        set { UpdateField(ref dateOfBirth, value, "DateOfBirth"); }
    }
}

次に、2つのイベントを処理し、必要に応じて更新を有効/無効にします。

于 2009-10-10T21:01:26.037 に答える