Я написал простой пользовательский элемент управления UpDown для своего приложения. Я визуализирую его в ListBox, чтобы при добавлении элементов управления UpDown они складывались по горизонтали.
Мой UserControl имеет одно свойство DependencyProperty, соответствующее номеру внутри элемента управления UpDown, которое называется NumberProperty.
Я добавляю несколько элементов управления UpDown в ListBox через привязку данных, где ItemsSource для ListBox - это просто ObservableCollection<NumberGroup>
с именем NumberGroups
. У каждого NumberGroup
есть только элемент с именем Number, и я хочу, чтобы этот номер отображался в соответствующем элементе управления UpDown при отображении ListBox.
My ListBox определяется в XAML следующим образом:
<ListBox Grid.Row="1" ItemsSource="{Binding NumberGroups}" ItemTemplate="{StaticResource NumberGroupTemplate}">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" Width="Auto" Height="Auto" />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
а DataTemplate для ListBox:
<DataTemplate x:Key="RackTemplate">
<StackPanel Orientation="Vertical">
<TextBlock>Group</TextBlock>
<updown:UpDown Number="{Binding Number}" />
</StackPanel>
</DataTemplate>
Это немного сбивает с толку, потому что я назвал DependencyProperty Number
в UpDown UserControl так же, как свойство в классе NumberGroup. NumberGroup - это просто:
public class NumberGroup
{
public int Number { get; set; }
}
Когда я запускаю приложение, я уже знаю, что оно не сработает, потому что окно вывода сообщает мне:
System.Windows.Data Error: 39 : BindingExpression path error: 'Number' property not found on 'object' ''UpDown' (Name='')'. BindingExpression:Path=Number; DataItem='UpDown' (Name=''); target element is 'UpDown' (Name=''); target property is 'Number' (type 'Int32')
Хорошо, поэтому он привязан к UserControl вместо ListItem ... который не может быть записан. Поэтому в качестве теста я удалил DataTemplate из определения ресурсов и ListBox и повторно запустил его. В ListBox я получил кучу NumberGroup
, чего я и ожидал!
Так почему же, когда я это делаю, кажется, что он привязывается к ListItem, но когда я определяю ItemTemplate, он хочет привязаться к элементу управления UpDown? Любое объяснение будет действительно оценено. Я просмотрел статьи доктора WPF и не понимаю, почему это могло произойти.
ОБНОВЛЕНИЕ
Хорошо, я понял кое-что, связанное с моей проблемой. В UserControl я устанавливаю DataContext для самого себя, чтобы я мог обрабатывать ICommand
, которые имеют дело с кнопками «Вверх» и «Вниз». Но по какой-то причине я еще не понимаю, это мешает привязке данных для ListItem! Почему это могло произойти, если UserControl содержится внутри ListItem?