インターフェースが次のようなサービスを持っているとしましょう:
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 でサービスを参照し、ビューをサービス インスタンスに直接バインドするだけですか?
これに関するあなたのコメントは大歓迎です!ありがとう!