使用WPF MVVM预加载/隐藏加载?

Gla*_*ius 14 c# wpf mvvm

我有在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>
Run Code Online (Sandbox Code Playgroud)

子元素是他们自己的ViewModel,我已经在上游声明了一些资源,因此有针对它们的DataTemplates.如果它有所帮助,我可以详细说明,但问题的关键因素是:

当我通过滚动在主控制元件和ComplexChildElement弹出的第一次,有一个短暂的,隐约可见闪烁,因为它得到的装饰 - 这是一堆的组合框饰的DevExpress.这种设置意味着有当我滚出一个记录与ComplexChildElement,然后再返回无闪烁,如果我开始与ComplexChildElement有主控显示,没有闪烁,当它再次弹出.

但主控制键到另一个数据源,我不能保证会出现在第一个记录,这是在一个更大的显示屏框架初始化加载ComplexChildElement我真的不想在此刻根左右.

那么我怎样才能保证在表单加载时会呈现ComplexChildElement,并可能在之后立即隐藏它?我已经尝试在这个后面的函数内部打开和关闭ChildPanels.Active:

 <dxmvvm:Interaction.Triggers>
    <dxmvvm:EventToCommand EventName="Loaded" Command="{Binding OnViewLoadedCommand}" />
 </dxmvvm:Interaction.Triggers>
Run Code Online (Sandbox Code Playgroud)

但这并没有让他们渲染.

顺便说一下这个功能:

foreach (var childModel in ChildPanels.Values)
  {
    childModel.Active = true;
    RaisePropertyChanged(() => childModel.Active);
  }
ChangeChildModel();
Run Code Online (Sandbox Code Playgroud)

最后一个函数调用是一个被调用的函数调用,用于在记录更改时更改子模型的可见性.如果我不进行最后一次调用,则所有子视图模型都会显示为可见.

Fab*_*Fab 3

为什么不从一开始就将Visibility设置为 false?这不会阻止您随后使用Active上的绑定。

绑定是可以的,但是因为 DataTemplate 使用它来修改 Visibility ,并且父控件使用它来了解是否应该呈现子控件。因此,根据PropertyChanged事件的订阅顺序,父控件可能会也可能不会将该控件视为可见。

顺便说一句,我想知道您的首要目标是否不是防止在多个控件上调用显示/隐藏时可能发生的闪烁。我不确定预渲染是否是正确的解决方案。

根据闪烁的根本原因,已经有几个修复方案: