Я подозреваю, что ответ на мою проблему довольно прост, но я хорошо осмотрел форум и, похоже, не нашел ничего такого же.
У меня достаточно сложная структура привязки с 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); Целевым свойством является «Цвет» (тип «Цвет»)
Любые предложения приветствуются.
Большое спасибо
Эд