【发布时间】:2015-12-15 14:29:45
【问题描述】:
我有一个用 WPF 编码的控件,它可以具有三个子元素之一 - 两个 SimpleChildElements 和一个 ComplexChildElement,比方说 - 并根据模型中的一些幕后逻辑在它们的显示之间交换我这样做。
<ItemsControl
ItemsSource="{Binding ChildPanels.Values}"
Name="ContentControl1"
>
<ItemsControl.ItemTemplate>
<DataTemplate>
<ContentControl Content="{Binding}"
Visibility="{Binding Path=Active, Converter={StaticResource BooleanToVisibilityConverter}}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
子元素是它们自己的 ViewModel,我已经在上游声明了一些资源,因此它们有 DataTemplates。如果有帮助,我可以详细说明,但问题的关键在于:
当我在主控件中滚动元素时,ComplexChildElement 第一次弹出时,在它被装饰时会出现一个短暂的、几乎看不见的闪烁——它是一堆用 DevExpress 装饰的组合框。此设置意味着当我使用 ComplexChildElement 滚动记录并再次返回时不会闪烁,如果我在那里开始显示带有 ComplexChildElement 的主控件,则当它再次弹出时不会闪烁。
但是主控件被键控到另一个数据源,我不能保证第一条记录中会有一个 ComplexChildElement,它是由一个更大的显示框架在初始化时加载的,我真的不想在其中扎根目前。
那么我如何保证 ComplexChildElement 会在表单加载时呈现,并可能在之后立即隐藏它?我已经尝试过在此后面的函数中打开和关闭 ChildPanels.Active:
<dxmvvm:Interaction.Triggers>
<dxmvvm:EventToCommand EventName="Loaded" Command="{Binding OnViewLoadedCommand}" />
</dxmvvm:Interaction.Triggers>
但这不会让它们渲染。
顺便说一句,那个函数:
foreach (var childModel in ChildPanels.Values)
{
childModel.Active = true;
RaisePropertyChanged(() => childModel.Active);
}
ChangeChildModel();
最后一个函数调用是在记录更改时更改子模型可见性的调用。如果我不做最后一次调用,所有子视图模型都开始可见。
【问题讨论】:
-
“我已经尝试过在这个后面的函数中打开和关闭 ChildPanels.Active:...但这并没有让它们渲染。”我认为这是预渲染视图的好地方。但为什么它根本不显示?
-
IDK,虽然我将功能添加到问题本身。当我在调试模式下运行并在函数中插入断点时,如果有帮助,我实际上看不到任何可见的 UI 元素。
-
ChangeChildModel() 有什么作用? :) 如果你正在处理它,你并没有真正预渲染它,对吧?
-
只需根据当前选择的记录适当地设置 ChildModel.Active 来改变可见性。
-
让子模型在加载时通知并处理自己的行为是否不谨慎?难道你不能把子模型放在一个可观察的集合中,当在集合中的一个子模型中调用 NotifyPropertyChanged 时,你会在父模型中为 Loaded 命令触发 RaisePropertyChanged 吗?