ItemsControl仅显示第一项

时间:2011-06-14 15:21:26

标签: c# wpf xaml binding itemscontrol

我怀疑我的问题的答案非常简单,但是我已经很好地浏览了论坛,似乎找不到任何相同的东西。

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

逻辑方面结构如下:

  • MainWindow Partial Class
    • WaterSamplerClass的ObservableCollection
      • ParametersClass(类的单个实例)
        • bothStateClass的ObservableCollection
          • int Number(Property)
          • string Label(Property)

XAML结构如下:

  • MainWindow Partial Class
    • ControlTemplate GroupBox(来自代码中列表的DataContext WaterSampler实例)
      • 包含使用bottleState控件模板的按钮的DataTemplate
      • ItemsControl使用DataTemplate显示大量的bottleStates
    • ControlTemplate包含ItemsControl中使用的Button的装饰

以下是代码的简化版本:

项目控件及其数据模板在GroupBox ControlTemplate中,其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>

保存项目模板数据的类:

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

包含DisplayBottleClass列表的类:

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

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

包含参数类的类:

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

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

最后是MainWindow类:

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:路径= GradientStopHighlight;的DataItem = NULL; target元素是'GradientStop'(HashCode = 23577486); target属性为'Color'(类型'Color')

非常欢迎任何建议。

非常感谢

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

尝试在CacheLength的{​​{1}}设置ItemsPanelTemplate.ItemsStackPanel属性。

MSDN定义的

ItemsControl

  

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

     

备注

     

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