我为我的应用程序编写了一个简单的 UpDown UserControl。我将它呈现在 ListBox 中,以便在添加 UpDown 控件时,它们水平堆叠。
我的 UserControl 有一个 DependencyProperty,它对应于 UpDown 控件内部的数字,称为 NumberProperty。
我通过数据绑定向 ListBox 添加了多个 UpDown 控件,其中 ListBox 的 ItemsSource 只是一个ObservableCollection<NumberGroup>
被调用的NumberGroups
. 每个都NumberGroup
只有一个名为 Number 的成员,我希望这个数字在呈现 ListBox 时出现在其各自的 UpDown 控件中。
我的 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>
ListBox 的 DataTemplate 是:
<DataTemplate x:Key="RackTemplate">
<StackPanel Orientation="Vertical">
<TextBlock>Group</TextBlock>
<updown:UpDown Number="{Binding Number}" />
</StackPanel>
</DataTemplate>
这有点令人困惑,因为我Number
将 UpDown UserControl 中的 DependencyProperty 命名为与 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 ......这是不能写的。因此,作为测试,我从 Resources 和 ListBox 定义中删除了 DataTemplate 并重新运行它。在 ListBox 中,我得到了一堆NumberGroup
s,这正是我所期望的!
那么为什么当我这样做时,它似乎与 ListItem 绑定,但是当我定义 ItemTemplate 时它想绑定到 UpDown 控件?任何解释将不胜感激。我已经阅读了 WPF 博士的文章,但不明白为什么会发生这种情况。
更新
好的,我想出了一些与我的问题有关的东西。在 UserControl 中,我将 DataContext 设置为自身,以便我可以处理ICommand
处理向上和向下按钮的 s。但由于某种我还不明白的原因,它与 ListItem 的数据绑定混淆了!如果 UserControl 包含在 ListItem 中,为什么会发生这种情况?