2012-04-04 36 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(); 
    } 
}