![](/img/trans.png)
[英]WPF MVVM hiding button using BooleanToVisibilityConverter
[英]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.