ItemsControl показывает только первый элемент - PullRequest
0 голосов
/ 14 июня 2011

Я подозреваю, что ответ на мою проблему довольно прост, но я хорошо осмотрел форум и, похоже, не нашел ничего такого же.

У меня достаточно сложная структура привязки с ItemsControl на дальнем конце, но она показывает только первый элемент. Я вижу, что данные на стороне кода верны и содержат только 8 элементов, первый элемент отображается правильно со всей маркировкой и цветами, как требуется.

Структура логической стороны имеет вид:

  • MainWindow Частичный класс
    • ObservableCollection of WaterSamplerClass
      • ParametersClass (один экземпляр класса)
        • ObservableCollection of bottleStateClass
          • int Number (Property)
          • строка Метка (Свойство)

Структура XAML имеет вид:

  • MainWindow Частичный класс
    • ControlTemplate GroupBox (экземпляр DataContext WaterSampler из списка, заданного в коде)
      • Кнопка DataTemplate, содержащая шаблон элемента управления bottleState
      • ItemsControl, используя DataTemplate, чтобы показать много бутылочных состояний
    • ControlTemplate, содержащий оформление кнопки, используемой в ItemsControl

Вот упрощенная версия кода:

Элемент управления и его шаблон данных внутри 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; }
    }
}

Класс, содержащий параметры class:

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: Path = GradientStopHighlight; DataItem = NULL; целевым элементом является GradientStop (HashCode = 23577486); Целевым свойством является «Цвет» (тип «Цвет»)

Любые предложения приветствуются.

Большое спасибо

Эд

Ответы [ 2 ]

0 голосов
/ 23 июля 2013

Попробуйте установить свойство CacheLength для ItemsPanelTemplate.ItemsStackPanel вашего ItemsControl.

CacheLength, как определено MSDN :

Размер буферов для элементов вне области просмотра, кратный размеру области просмотра.По умолчанию это 4.0.

Заметки

Для повышения производительности прокрутки ItemsStackPanel создает и кэширует контейнеры элементов для элементов, которые находятся за пределами экрана с обеих сторон области просмотра.Свойство CacheLength указывает размер буферов для элементов вне экрана.Вы указываете CacheLength в кратных от текущего размера области просмотра.Например, если CacheLength равен 4.0, на каждой стороне области просмотра буферизуются элементы на 2 области просмотра.Вы можете установить меньшую длину кэша, чтобы оптимизировать время запуска, или установить больший размер кэша, чтобы оптимизировать производительность прокрутки.Контейнеры элементов, находящиеся вне экрана, создаются с более низким приоритетом, чем контейнеры в окне просмотра.

0 голосов
/ 14 июня 2011

Ваш ItemsControl объявляет и ItemsSource, и DataContext.Я считаю, что эти два свойства являются взаимоисключающими - установка свойства DataContext отключает элемент управления от данных, связанных с деревом логического элемента управления.

Удалите привязку данных DataContext =, и я думаю, вы увидите элементы в ItemsSourceпоявляются в вашем ItemsControl.

Также обратите внимание, что ItemsControl не предоставляет отдельного определения пользовательского интерфейса.В целях отладки может быть полезно добавить ListBox или другой конкретный ItemsControl и присвоить ему те же параметры привязки данных, чтобы убедиться, что привязки данных нормальны.Если ItemsControl не показывает ничего, кроме ListBox, то ваша проблема не в привязке данных, а в шаблонах визуальных элементов ItemsControl.

...