ItemsControl DataContext绑定错误

时间:2011-12-13 19:43:06

标签: c# wpf binding converter itemscontrol

我已经研究过这个解决方案: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>

1 个答案:

答案 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中。