1

インターフェースが次のようなサービスを持っているとしましょう:

public interface IProxyRotator
{
    ProxyRotationMode RotationMode { get; set; }

    void Add(Proxy proxy);
    void AddRange(IEnumerable<Proxy> proxies);
    bool Remove(Proxy proxy);
    void Clear();
    Proxy Peek();
}

問題は、サービスに含まれるプロキシをビューにバインドする方法についてです。

私が行っている方法は、サービス インターフェイスで ProxyList 配列を作成し、そのプロパティへの変更を通知することです。このような:

public interface IProxyRotator : INotifyPropertyChanged
{
    // ... omited for brevity
    Proxy[] ProxyList { get; }
}

ViewModel には、プロキシ用の別の配列プロパティがあります。ViewModel がインスタンス化されると、IProxyRotator PropertyChanged イベントにサブスクライブし、イベントを「転送」して、プロキシ配列が変更されたことをビューが実際に確認できるようにします。このような:

public class ViewModel : INotifyPropertyChanged
{
    public ViewModel(IProxyRotator proxyRotator)
    {
        this.proxyRotator = proxyRotator;
        this.proxyRotator.PropertyChanged += (sender, e) =>
        {
            if (e.PropertyName == "ProxyList")
            {
                this.RaisePropertyChanged("ProxyList");
            }
        }
    }

    public Proxy[] ProxyList
    {
        get { return this.proxyRotator.ProxyList; }
    }

    private IProxyRotator proxyRotator;
}

問題は、サービスの PropertyChanged イベントをインターセプトして転送する必要があるというオーバーヘッドが私を悩ませていることです..間違っていると感じています。INotifyCollectionChanged を適切に実装する代わりに、INotifyPropertyChanged を実装する多数の異なるオブジェクトに依存しなければならない場合にも、これは大きな欠点です。IProxyRotator サービスに INotifyCollectionChanged を実装することを検討し (これは IEnumerable も実装することを意味します)、ViewModel でサービスを参照し、ビューをサービス インスタンスに直接バインドするだけですか?

これに関するあなたのコメントは大歓迎です!ありがとう!

4

1 に答える 1

2

INotifyCollectionChanged は、追加/削除についてユーザー (またはビュー) に通知しますが、プロパティの変更 (更新の場合) については通知しません。IPropertyChanged は、特定のプロパティ (たとえば ProxyList) が変更されたことをビューに通知できます (ただし、このコレクション内のアイテムのプロパティの変更については通知しません)。

また、サービスに INotifyCollectionChanged インターフェイスは必要ないと思います。たとえば、ProxyList に適切な実装を使用するだけです。

public interface IProxyRotator : INotifyPropertyChanged
{
    // ... omited for brevity    
    ObservableCollection<Proxy> ProxyList { get; }
}
于 2012-08-23T02:10:48.483 に答える