我目前有一個使用MVVM的WPF項目。在我的項目,我利用它充當我的應用程序所使用的各種控件集合緩存靜態類的,這樣的事情:試圖瞭解如何將rx.net與現有MVVM項目相結合
public static class AppCache
{
public static ObservableCollection<MyObject> MyObjects { get; set; }
private static async void GetMyObjectsAsync()
{
await Task.Run(() => GetMyObjects());
Mediator.Instance.NotifyColleagues("MyObjectsUpdatedMessage", true); // A helper class that implements messaging
}
private static GetMyObjects()
{
// Get objects via service call
...
MyObjects = result;
}
static AppCache()
{
MyObjects = new ObservableCollection<MyObject>();
GetMyObjectsAsync();
}
}
然後我訂閱調解員在我的各種的ViewModels:
public class MyViewModel : ViewModelBase
{
...
public ObservableCollection<MyObject> MyObjects
{
// My ViewModelBase lets me implement INotifyPropertyChanged like this
get { return GetValue(() => MyObjects); }
set { SetValue(() => MyObjects, value); }
}
[Message("MyObjectsUpdatedMessage")]
private void OnMyObjectSourceUpdated(bool c)
{
MyObjects = AppCache.MyObjects;
}
public MyViewModel()
{
Mediator.Instance.RegisterHandler<bool>("MyObjectsUpdatedMessage", OnMyObjectSourceUpdated);
}
}
我有這種方法的問題是,當我做收藏的東西在的ViewModels(如添加或編輯MyObject
),那麼我要回去和手動更新的全球應用程序緩存的收集和確認它與ViewModel中的內容相匹配,然後確保使用此集合更新所有其他ViewModel以使用新的v ALUE因爲沒有約束力的參與:MyOtherViewModel.MyObjects = AppCache.MyObjects
另一種方法是使GetMyObjectsAsync()
公衆和有應用程序緩存從後透過我的視圖模型的變化更新數據庫本身,然後使用調停更新使用集合中的所有其他視圖。我不喜歡這個,因爲這意味着我最終會打出一個我不想要的服務電話。
我想知道的是,如果有任何方法可以使用Reactive Extensions來簡化我的過程,這樣我可以在我的ViewModels訂閱的AppCache中定義某種Reactive屬性,以及何時更新會將其更新推送到所有ViewModel,這是我可用的兩個選項之間的混合(手動更新AppShared集合,但是不需要中介者就通知其所有子集)。
我想我真正想要的是在ViewModel之間有一個基本上可綁定和共享的屬性。
是否有任何種類的可用於實現這種事情的反應性屬性?喜歡的東西:
編輯:
我能得到的訂閱工作如下,但是這又是類似於使用調解員,因爲我有打電話給NotifyMyObjectChanged
每當我更新MyObjects的選項。有沒有辦法讓MyObjectsObservable
'偵聽'對MyObjects的更改並自動調用NotifyMyObjectChanged
?如果沒有辦法做到這一點,通過Mediator使用RX有什麼好處?
public static class AppCache
{
public static ObservableCollection<MyObject> MyObjects { get; set; }
public static IObservable<ObservableCollection<MyObject>> MyObjectsObservable => _mySubject; // C# 6 syntax
public static Subject<ObservableCollection<MyObject>> _mySubject { get; set; }
private static async void GetMyObjectsAsync()
{
await Task.Run(() => GetMyObjects());
NotifyMyObjectChanged() // this basically just replaces the mediator
}
private static GetMyObjects()
{
...
MyObjects = result;
}
private static void NotifyMyObjectChanged()
{
_mySubject.OnNext(MyObjects);
}
static AppCache()
{
_mySubject = new Subject<ObservableCollection<MyObject>>();
GetMyObjectsAsync();
}
}
public class MyViewModel : ViewModelBase
{
ObservableCollection<MyObject> MyObjects
{
get { return GetValue(() => MyObjects); }
set { SetValue(() => MyObjects, value); }
}
IDisposable _subscription { get; }
MyViewModel()
{
_subscription = AppCache.MyObjectsObservable.Subscribe (HandleMyObjectChanged);
}
private void HandleMyObjectChanged(ObservableCollection<MyObject> myObjects)
{
MyObjects = myObjects;
}
public void Dispose()
{
_subscription.Dispose();
}
}
IMO這是一款很好用RX的,但你的問題非常廣泛,所以可能不適合SO職位。 – CodingGorilla
對不起,我會盡量讓我的問題更具體 –
還請考慮http://reactiveui.net/建立在system.reactive – kenny