2017-01-19 7 views
2

できるだけ詳しく問題を説明しようとします。私のアプリケーションはmvvmを使って構成され、いくつかの静的ビューを読み込むシェルビューを持っています。 heresが質問1になる: shellviewmodelでこれらのビューモデルをインスタンス化するのがよい方法ですか?ReactiveUIビューインジェクション。どうすればいいのですか?

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になったときにリストから削除されます。しかし、これらのアイテムを適切に処分する方法がわかりません。 navigateメソッドで新しいインスタンスを作成すると、古い新しいProductionOrderDetailViewModelが破棄されますか?どうすればいいですか? 正解に必要な部分が欠けていると思いますので、お尋ねください。必要な情報をお送りします。

事前に感謝し、よろしく

+0

ここで間違った言葉を使っているような気がします。 '' itemsleftプロパティが0になったときにアイテムがリストから削除されます.'' ''あなたのitemleftプロパティが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に、より複雑なものを置きます。私のviewmodelの変更は、私は古いアニメーションを停止し、新しいものを開始する必要があるときはいつでも私のコードのいくつかの例では、私は

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

を持っています。最も簡単な方法は、StartAnimation()がアニメーションを停止するIDisposableを返すことです。 SubscribeDisposableは、新しいものが作成される前に古い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 }; 
} 

これはあなたが探していたことを希望しています。

関連する問題