2012-04-04 55 views
1

我得到了一個打開對話框的Silverlight頁面。它是一個管理頁面,其中一些高級邏輯通過web服務與數據庫進行交談。對於Silverlight客戶端,我們最大限度地使用MVVM。第一次打開對話框時,根據實施的邏輯,一切正常。Silverlight綁定值錯誤

問題:一次打開的對話框中,我們的數據綁定製定者開始接收錯誤的價值觀。

代碼:

如何創建對話框:

MyPopupViewModel myPopup = new MyPopupViewModel(); 
Caliburn.Micro.Execute.OnUIThread(() => WindowManager.ShowDialog(myPopup)); 

一個綁定的,最終得到錯誤的值:

<ComboBox 
    ItemsSource="{Binding YesNoItems}" 
    SelectedValue="{Binding IsSynchronizing, Mode=TwoWay, Converter={StaticResource BooleanToYesNoConverter}}" 
    /> 

我曾嘗試:

  • 我在setter中放置了斷點。這是我意識到邏輯正確的原因,但是setter在第二次打開時被其他值調用。

  • 我發現被打開的{1,2,3}次{1,2,3}次的獲得者被稱爲{1,2,3}次。

  • 我確保每次都初始化對話框。也許Caliburn-micro會以某種方式緩存舊的,但它顯然不會緩存很長時間,因爲它在第三次打開時會再次正常工作。

+0

你不使用窗口管理器,用SL時需要類似ShowDialogResult?由於它是異步的? – 2012-04-04 19:26:15

+0

嗯,我實際上在創建對話框時添加了關閉事件的事件處理程序。 – JOG 2012-04-05 07:55:35

回答

0

通過添加下面的裝飾在對話框View的構造函數,在代碼隱藏解決它。我在ViewModel已經有了這個裝飾器,但View顯然也需要它。

PartCreationPolicy(CreationPolicy.NonShared)] 

一位同事幫我通過設置斷點,然後設置一個ID爲每個實例發現這一點。這樣我們證明有幾個例子。非常實用。所以視圖需要被告知每次重新創建而不是被重用。

最終的代碼隱藏看起來是這樣的:

[Export] 
[PartCreationPolicy(CreationPolicy.NonShared)] 
public partial class MyPopupView 
{ 
    public MyPopupView() 
    { 
     InitializeComponent(); 
    } 
}