2017-03-10 29 views
1

我有一個使用Caliburn.Micro 2.0.1的wpf應用程序,我發現了Caliburn.Micro的奇怪行爲。在最新的3.0.3中也存在。查看不顯示單身ViewModel

超級簡單的項目重現錯誤:https://github.com/ihtfw/CaliburnMicroBug

MainWindowViewModel是導體的屏幕。 有兩個ScreenViewModel作爲具有屬性SingletonViewModel的MainWindowViewModel的項目。 在MainViewModel中,我可以切換到第一個ScreenViewModel或第二個。

除了在切換到第二個屏幕後僅在第二個ScreenViewModel上顯示SingletonViewModel的視圖之外,一切都很完美。

重現:

  • 開始應用
  • 切換到第二個屏幕
  • 切換回第一個畫面
  • 信息查看SingletonViewModel沒有顯示=(

如何解決這個?

更新

使用ContentControl無法做到這些。應該使用明確的視圖。在這種情況下SingletonView並設置它的DataContext。連接Caliburn.Micro動作綁定他們沒有上下文。所以結果將是:

<local:SingletonView DataContext={Binding Path=SingletonViewModel} cal:Action.TargetWithoutContext="{Binding}" /> 

回答

2

正如其他答案中所述,您不能擁有「單體視圖」,xaml UI模型將不允許相同的UI元素在視覺樹中兩次。

但是,您可以做的是將同一視圖的兩個實例綁定到視圖模型。

要做到這一點,你需要避開框架的功能。

實現IViewAware的內部任何視圖模型都對視圖持有一個弱引用,任何時候框架都會嘗試定位視圖模型的視圖,以便首先向視圖模型查詢該引用。

如果返回引用,則視圖將從其現有位置移除並插入新位置。

爲了阻止這個你可以做三種情況之一:

  1. 讓你的SingletonViewModel不是從一些實現IViewAwarePropertyChangedBase繼承。
  2. 做一些真正的事情,並用下面的第一個代碼示例將附件視圖清空。
  3. 更改ViewLocator.LocateForModel刪除此行爲與下面的第二個代碼示例。

哈克空出視圖

protected override void OnViewAttached(object view, object context) 
{ 
    Views[context ?? ViewAware.DefaultContext] = null; 
} 

刪除IViewAware行爲

ViewLocator.LocatorForModel = (model, location, context) => ViewLocator.LocateForModelType(model.GetType(), location, context); 
0

我已經在你的項目上工作,發現你的問題是在MainWindows構造函數中。更改MainWindow的構造函數,如下所示:

public MainWindowViewModel() 
    { 


     Items.Add(new ScreenViewModel 
     { 
      DisplayName = "Screen 1", 
      SingletonViewModel = new SingletonViewModel() 
     }); 

     Items.Add(new ScreenViewModel 
     { 
      DisplayName = "Screen 2", 
      SingletonViewModel = new SingletonViewModel() 
     }); 

     ActiveItem = Items.First(); 
    } 
+0

是它的工作,但SingletonViewModel應該是單身!並且在你改變之後它不是。 – ihtfw

0

這不是一個錯誤。

A UIElement例如UserControl只能有一個邏輯父項。

要創建雙ScreenViews,和你想添加相同SingletonView他們兩個,這是不可能的,因爲SingletonView不能有兩個家長。

+0

每個ScreenView都有自己的SigletonView,SingletonViewModel只是DataContext。爲什麼Caliburn.Micro無法實現?如果我寫了 沒關係。但是 將不起作用 – ihtfw

+0

每個屏幕是...但是你有一個承載SingletonView的ContentControl,並且你只創建該View的一個實例,根本不可能。如果您希望ViewModel的單個實例成爲兩個Views的DataContext,那麼您必須使用另一種方法。 –