TPTB 已决定我们的应用程序必须在单个窗口中运行,不允许以模态模式弹出新窗口。
当然,我们有一个 UI 设计,涉及在整个地方弹出模式对话框。
所以我在窗口中添加了一个顶级网格。在那个网格中,我没有定义行或列,所以所有内容都绘制在第 0 行/第 0 列中。
Grid 中的第一个元素是另一个 Grid,其中包含通常显示在 Window 中的所有内容。第二个是带有灰色、半透明背景的全尺寸边框。其余的是具有宽边距和白色背景的边框,包含需要显示为弹出窗口的各种用户控件。除了第一个之外,所有的都有 Visibility="Collapsed"。
然后,当我需要显示一个弹出窗口时,我会在灰色背景和相应的 UserControl 上设置 Visibility="Visible"。结果是一个很好的阴影盒效果,效果很好。
直到有人决定弹出窗口需要能够显示弹出窗口。以不可预测的顺序。
我在网格中使用 Visibility="Collapsed" 元素实现的方法的局限性在于它们的顺序是固定的。UserControlB 将始终显示在 UserControlA 之上,即使是 UserControlB 要求显示 UserControlA。这是不可接受的。
所以我的下一个尝试是在 Window.Resources 中定义各种 UserControls,并在代码中将它们添加到 Grid 中:
this.masterGrid.Children.Add(this.Resources["userControlA"] as UserControlA);
这几乎奏效了。但是绑定都搞砸了。
例如,其中一个控件应该将属性绑定到 Window 视图模型的成员对象中的集合的 CurrentItem。当我将控件定义为网格中的不可见项时,它工作正常。但是当我将它定义为资源时,属性为空——它从未被绑定。
因此,在将其添加到网格后,我尝试将其绑定到代码中:
userControlA.SetBinding(UserControlA.myProperty, new Binding()
{ Source = this.viewModel.myCollection.CurrentItem });
编译和运行都很好,但我没有绑定到正确的对象。
第一次显示 UserControl 时,我看到绑定到它的正确对象。但是当我关闭它并将集合中的 CurrentItem 移动到另一个对象并再次显示 UserControl 时,我仍然看到第一个对象绑定。如果我再次关闭它,并第三次打开它,那么我将看到正确的对象绑定到控件。
我已经检查了代码,并且我绑定的 CurrentItem 每次都是正确的,但它似乎只需要每隔一次。
所以我首先尝试明确清除绑定:
BindingOperations.ClearBinding(userControlA, UserControlA.myProperty);
userControlA.SetBinding(UserControlA.myProperty, new Binding()
{ Source = this.viewModel.myCollection.CurrentItem });
但这似乎没有任何区别。
总而言之,这感觉就像我在一个兔子洞里奔跑,越来越深入地追逐复杂性,以解决应该是一个相当简单的问题。
有没有人有任何建议:
- 如何获得绑定以处理动态添加的元素,或者
- 如何在不使用动态排序元素的情况下将任意排序的弹出窗口显示为阴影框?
提前致谢。