我已经研究过这个解决方案:Show if ItemsControl.ItemsSource is null。 我通过codebehind将ItemsControl的DataContext设置为ObservableCollection。一切正常,只是在加载阶段只解析一次。如果项目控件在开头有几个项目,则文本会消失,但不会在以后显示。如果它是空的,则显示文本,但是当我稍后添加项目时它不会消失。我也尝试过ItemsSource,但没有运气。我知道我现在使用控制模板,我可以使用相对源TemplatedParent,但我只想确保。进一步测试后,即使项目显示在我的itemscontrol上,尝试添加/删除列表中的项目后,转换器功能似乎也没有激活。
<ItemsControl x:Name="MedicationList" ItemTemplate="{StaticResource UserTemplate}">
<ItemsControl.Template>
<ControlTemplate TargetType="ItemsControl">
<Grid>
<TextBlock Text="No Items to Display" Visibility="{Binding DataContext, ElementName=MedicationList, Converter={StaticResource AnyItemsToVisibilityConverter}}" />
<ItemsPresenter />
</Grid>
</ControlTemplate>
</ItemsControl.Template>
</ItemsControl>
答案 0 :(得分:3)
您使用什么作为datacontext / itemssource?如果它是我期望的ObservableCollection
,那么你最好绑定到它的“Count”属性,然后在必要时使用触发器来折叠文本块。
绑定当前未更新的原因是DataContext
本身并未实际更改。 DataContext
上的属性正在发生变化,因此如果绑定到正确的属性(count),绑定将会更新。
此代码段应该有效:
<ControlTemplate TargetType="ItemsControl">
<Grid>
<TextBlock x:Name="txtBlock" Text="No Items to Display" Visibility="Collapsed" />
<ItemsPresenter />
</Grid>
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding Path=Count}" Value="0">
<Setter TargetName="txtBlock" Property="Visibility" Value="Visible"/>
</DataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
通过使用数据触发器,您可以避免转换器将数值转换为可见性并将所有内容保存在.xaml中。