2017-08-01 11 views
0

ShellViewModel : Conductor<T>.Collection.OneActiveを考えてみましょう。ここでは2つのViewModelをPropertyInjectionから注入します。したがって、これらのビューモデルは常に同じインスタンスを持ちます。Caliburn Micro ActivateItemはバインディングを更新しません

public SomeViewModel SomeViewModel {get; set;}  
public AnotherViewModel AnotherViewModel {get; set;} 

SomeViewModelは(NotifyPropertyChanged有する)プロパティにテキストを結合し、取り付けられた変換器を有するテキストブロックを有しています。

  • ActivateItem(someViewModel)を初めて呼び出すときは、SomeView.xamlで定義されているコンバータを入力します。
  • ActivateItem(AnotherViewModel)に電話してもう一度ActivateItem(SomeViewModel)を入力した場合は、このコンバーターを入力しません。

ActivateItemを呼び出すと常にバインディングが更新され、コンバータが再び実行されるか、間違っていると思いますか?

私は、プロパティ自体に何も変更されておらず、NotifyPropertyChangedは呼び出されていないことを認識しています。しかし、私はusercontrolを可視化することでバインディングがリフレッシュされることを期待しています。

  • はのOnActivate()Refresh()を呼び出す: は、私の知る限り、これはなく、これらのバインディングがリフレッシュされることを確認する方法はありCaliburn.Micro

    ずに古い学校WPFアプリケーションで何が起こるかでありますこれはbecausを起こるRefresh()

答えて

0

を呼び出しますSomeViewModelに処理されますEventAgregatorでイベントを公開SomeViewModel

  • ビューキャッシュのe:Conductor<T>Screenであり、ScreenViewAwareです。そのクラスはビューインスタンスをキャッシュするように設計されています。最初のビューのScrollViewerの位置は、プロパティにバインドされていなくても、ビューモデルの間を行き来するときに同じままになります。

    あなたはこのように、あなたのビューモデルのGetView(object)メソッドをオーバーライドすることができ、次のいずれか

    public override object GetView(object context = null) 
    { 
        return null; 
    } 
    

    これは本質的にビューのキャッシュを無効にします。

    また、必要に応じてビューの場所のコードを変更することもできます。ブートストラップスタートアップにこれを追加してください:

    private void CustomizeViewLocation() 
    { 
        var log = LogManager.GetLog(typeof(ViewLocator)); 
    
        ViewLocator.LocateForModel = (model, displayLocation, context) => { 
    
         // Either remove the IViewAware handling to completely disable 
         // view caching... 
    
         var viewAware = model as IViewAware; 
         if (viewAware != null) 
         { 
          var view = viewAware.GetView(context) as UIElement; 
          if (view != null) 
          { 
           // Or add this custom code to always refresh... 
    
           var propertyChangedBase = model as PropertyChangedBase; 
           if (propertyChangedBase != null) 
           { 
            propertyChangedBase.Refresh(); 
           } 
    
           // End custom code. 
    
           var windowCheck = view as Window; 
           if (windowCheck == null || (!windowCheck.IsLoaded && !(new WindowInteropHelper(windowCheck).Handle == IntPtr.Zero))) 
           { 
            log.Info("Using cached view for {0}.", model); 
            return view; 
           } 
          } 
         } 
    
         return ViewLocator.LocateForModelType(model.GetType(), displayLocation, context); 
        }; 
    }