我有一个打开对话框的Silverlight页面。它是一个管理页面,其中包含一些通过Web服务与数据库通信的高级逻辑。对于Silverlight客户端,我们充分利用MVVM。第一次打开对话框,根据实现的逻辑,一切正常。
问题: 第二次时间打开对话框,我们的数据绑定设置器开始接收错误的值。
代码:
如何创建对话框:
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,1}}。
我确保每次都初始化对话框。也许Caliburn-micro以某种方式缓存旧版本,但它显然不会长时间缓存它,因为它在第三次打开时再次正常工作。
答案 0 :(得分:0)
通过在代码隐藏中的对话框View
的构造函数中添加以下装饰器来解决它。我已经在ViewModel
中找到了装扮器,但View
显然也需要它。
PartCreationPolicy(CreationPolicy.NonShared)]
一位同事帮我通过破坏点找到了这个,然后为每个实例设置了一个ID。这样我们就证明有几个例子。非常实用。所以需要告诉Views每次重新创建而不是重复使用。
最终的代码隐藏看起来像这样:
[Export]
[PartCreationPolicy(CreationPolicy.NonShared)]
public partial class MyPopupView
{
public MyPopupView()
{
InitializeComponent();
}
}