繁体   English   中英

使用WPF MVVM进行预渲染/隐藏?

[英]Prerendering/hiding on load with 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>

子元素是它们自己的ViewModels,我在上游声明了一些资源,因此有用于它们的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();

最后一个函数调用是在记录更改时更改子模型可见性的函数调用。 如果我不打最后一个电话,则所有子视图模型都开始可见。

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

绑定是可以的,但是由于DataTemplate使用它来修改Visibility 而父控件使用它来知道是否应呈现子控件。 因此,取决于对PropertyChanged事件的订阅顺序,父控件可能会或可能不会将控件视为可见。

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

根据闪烁的根本原因,已经对SO进行了一些修复:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM