2017-01-19 72 views
2

我會盡可能詳細地解釋我的問題。我的應用程序使用mvvm編寫,並有一個加載一些靜態視圖的shellview。繼承人問題1: 在shellviewmodel中實例化這些視圖模型是否是一種很好的做法?ReactiveUI Viewinjection。如何做到這一點

public ShellViewModel(IScreen screen) 
    { 
     HostScreen = screen; 


     LogoViewModel = new LogoViewModel(HostScreen); 
     ... 
     StatusViewModel = new StatusViewModel(); 

    } 

反正我也有有一個列表,它的ItemSource屬性當用戶選擇了一個新的列表項被綁定到一個ReactiveList現在

 public ShiftOrderView()//ShiftOrderViewModel viewModel) 
      { 
       InitializeComponent(); 

       this.WhenActivated(
        d => 
         { 
          this.OneWayBind(ViewModel, vm => vm.ProductionOrderList, v => v.ShiftOrder.ItemsSource).AddTo(d); 
    }); 
} 

這個項目顯示在另一個視圖靜態視圖。我目前通過導航做到這一點

 this.WhenActivated(d => 
     { 
      this.WhenAnyObservable(o => o.ProductionOrderList.ItemChanged) 
       .Where(x => x.PropertyName == "ItemsLeft") 
       .Select(x => x.Sender) 
       .Where(x => x.ItemsLeft == 0) 
       .Subscribe(x => 
       { 

        ProductionOrderList.Remove(x); 
       }).AddTo(d); 

      this.WhenAnyValue(vm => vm.SelectedProductionOrderViewModel).Where(pvm => pvm != null) 
       .Subscribe(pvm => 
       { 
        HostScreen.Router.NavigateAndReset.Execute(
         new ProductionOrderDetailViewModel(HostScreen, 
         Locator.CurrentMutable.GetService<IProductionItemService>(), pvm)); 
       }).AddTo(d); 

     }); 

但我認爲這是不正確的方式,並引入了內存泄漏。正如你在上面的代碼中看到的,當itemsleft屬性達到0時,項目從列表中移除。但是我不知道如何正確處理這些項目。如果我在導航方法中創建新實例,舊的新ProductionOrderDetailViewModel會被丟棄嗎?如果不是我怎麼能做到這一點? 我相信我錯過了一些正確答案所需的部分,所以請問,我會提供您需要的信息。

在此先感謝和親切的問候

+0

我有一種感覺,你在這裏使用了錯誤的單詞。 '當itemsleft屬性達到0時,項目從列表中移除。你的意思是''當發送者的itemsleft屬性達到0時,發件人會從列表中刪除 – bradgonesurfing

回答

0

我想我看到你有問題模式,我承認它。你有一個T : IDisposable類型的財產,當該財產更新時,你希望處置舊版本。我有一個IObservable<T>的擴展方法,它將以一般方式解決這類問題。

擴展方法是

public static IDisposable SubscribeDisposable<T> 
     (this IObservable<T> observable, Func<T, IDisposable> action) 
    { 
     var d = new SerialDisposable(); 
     return observable 
      .Finally(() => d.Dispose()) 
      .Subscribe(e => 
      { 
       d.Disposable = Disposable.Empty; 
       d.Disposable = action(e); 
      }); 
    } 

,您可以使用它像

this 
    .WhenAnyValue(p=>p.DisposableProperty) 
    .SubscribeDisposable(v=>v) 
    .AddTo(d); 

但通常我把更復雜的東西在SubscribeDisposable。例如,在我的一些代碼,我有

this.LoadUnloadHandler(() => this 
       .WhenAnyValue(p => p.ViewModel) 
       .WhereNotNull() 
       .SubscribeDisposable(x=>x.StartAnimation())); 

每當我的視圖模型的變化,我需要停止舊的動畫,並開始一個新的。最簡單的方法是StartAnimation()返回停止動畫的IDisposableSubscribeDisposable確保在創建新的IDisposable之前處理舊的IDisposable,從而使動畫排列整齊。

只是爲了清楚StartAnimation方法。

public IDisposable StartAnimation() { 
    return Animation = new PlayController(
     maximum: 2 * Math.PI, 
     minSpeed: Math.PI/180 * 10, 
     maxSpeed: 2 * Math.PI, 
     currentSpeed: Math.PI, 
     jogAmount: Math.PI/50, 
     fps: 120, 
     modes: new Dictionary<AnimationMode, string> 
     { 
      { AnimationMode.PlayOnce, "Play once" }, 
      { AnimationMode.PlayAndReverse, "Play and reverse" }, 
      { AnimationMode.Loop, "Loop" } 
     }) { StickyWidth = 50 }; 
} 

我希望這是你在找什麼。