繁体   English   中英

ItemsControl 仅显示第一项

[英]ItemsControl only shows first item

我怀疑我的问题的答案很简单,但我仔细查看了论坛,似乎找不到任何相同的东西。

我有一个相当复杂的绑定结构,远端有一个 ItemsControl,但它只显示第一项。 我可以看到代码端的数据是正确的,只包含 8 个项目,第一个项目正确显示,所有标签和颜色都按要求正确显示。

逻辑侧结构如下:

  • 主窗口部分 Class
    • WaterSamplerClass 的 ObservableCollection
      • ParametersClass(类的单个实例)
        • BottleStateClass 的 ObservableCollection
          • 整数(属性)
          • 字符串 Label(属性)

XAML 结构如下:

  • 主窗口部分 Class
    • ControlTemplate GroupBox(代码中设置的列表中的 DataContext WaterSampler 实例)
      • DataTemplate 包含使用bottleState 控件模板的按钮
      • ItemsControl 使用 DataTemplate 来显示很多瓶状态
    • ControlTemplate 包含 ItemsControl 中使用的 Button 的装饰

这是代码的简化版本:

GroupBox ControlTemplate 中的 Items 控件及其数据模板,其 datacontext 是 WaterSampler 的一个实例。

<ControlTemplate x:Key="WaterSamplerGroupBoxTemplate" TargetType="{x:Type GroupBox}" >
   <GroupBox Header="{Binding Path=Header}" Width="300" Margin="10,5,10,0" HorizontalAlignment="Center">
    <StackPanel Orientation="Horizontal">
      <StackPanel.Resources>
         <DataTemplate x:Key="BottleStateDataTemplate">
               <Button Template="{DynamicResource ValveStatusTemplate}" />
         </DataTemplate>
      </StackPanel.Resources>
    <ItemsControl Name="bottleStateListBox" ItemTemplate="{StaticResource BottleStateDataTemplate}" Margin="5" Height="50" ItemsSource="{Binding BottleIsFullList}" DataContext="{Binding Parameters}"/>
    </StackPanel>
  </GroupBox>
</ControlTemplate>

简化的按钮控件模板:

<ControlTemplate x:Key="ValveStatusTemplate" TargetType="{x:Type Button}" >
      <StackPanel Orientation="Vertical" Width="30" Margin="5" >           
           <TextBlock Text="{Binding Number}" FontSize="18" Canvas.Left="8"/>
      </StackPanel>
</ControlTemplate>

保存项目模板数据的 class:

public class DisplayBottleStateClass : INotifyPropertyChanged
{
    private int number;
    public int Number
    {
        get { return number; }
    }
}

包含 DisplayBottleClass 列表的 class:

public class WSParametersClass : INotifyPropertyChanged
{
    private List<DisplayBottleStateClass> bottleIsFullList = new List<DisplayBottleStateClass>();

    public List<DisplayBottleStateClass> BottleIsFullList
    {
        get { return bottleIsFullList; }
    }
}

包含参数 class 的 class:

public class WaterSampler : INotifyPropertyChanged
{
    private WSParametersClass parameters = new WSParametersClass();

    public WSParametersClass Parameters
    {
        get { return parameters; }
        set { parameters = value; OnPropertyChanged("Parameters"); }
    }
}

最后是 MainWindow class:

public partial class MainWindow : Window
{
    public class WaterSamplerListClass : ObservableCollection<WaterSampler> { }
    private WaterSamplerListClass waterSamplers = new WaterSamplerListClass();
    public MainWindow()
    {
        waterSamplers.Add(new WaterSampler(0));
        WaterSampler0Group.DataContext = (waterSamplers[0]);
    }
}

我确实收到了我使用的两个画笔的绑定错误,但是当我用 XAML 中的固定值替换它们时,仍然只显示第一个元素。 该列表似乎也通过绑定正确更新,因为我可以看到第一个元素正确更改。 我得到的错误是:

System.Windows.Data 错误:2:找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement。 BindingExpression:Path=GradientStopHighlight; 数据项=空; 目标元素是'GradientStop'(HashCode=23577486); 目标属性是“颜色”(类型“颜色”)

任何建议都会非常受欢迎。

非常感谢

埃德

尝试在ItemsControlItemsPanelTemplate.ItemsStackPanel上设置CacheLength属性。

MSDN定义的CacheLength

视口外项目的缓冲区大小,以视口大小的倍数表示。 默认值为 4.0。

评论

为了提高滚动性能,ItemsStackPanel 为视口两侧屏幕外的项目创建并缓存项目容器。 CacheLength 属性指定屏幕外项目的缓冲区大小。 您以当前视口大小的倍数指定 CacheLength。 例如,如果 CacheLength 为 4.0,则在视口的每一侧缓冲 2 个视口的项目。 您可以设置较小的缓存长度以优化启动时间,或设置较大的缓存大小以优化滚动性能。 屏幕外的项目容器的创建优先级低于视口中的项目容器。

您的 ItemsControl 声明了 ItemsSource 和 DataContext。 我相信这两个属性是互斥的——设置 DataContext 属性会断开控件与逻辑控件树关联的数据。

删除 DataContext= 数据绑定,我想您会看到 ItemsSource 中的项目出现在您的 ItemsControl 中。

另外,请注意 ItemsControl 本身不提供任何 UI 定义。 出于调试目的,放入 ListBox 或其他具体的 ItemsControl 并为其提供相同的数据绑定设置以验证您的数据绑定是否正常会很有用。 如果 ItemsControl 没有显示任何内容,但 ListBox 显示,那么您的问题不在于数据绑定,而在于模板化 ItemsControl 视觉效果。

暂无
暂无

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

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