1

我为我的应用程序编写了一个简单的 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 中,我得到了一堆NumberGroups,这正是我所期望的!

那么为什么当我这样做时,它似乎与 ListItem 绑定,但是当我定义 ItemTemplate 时它想绑定到 UpDown 控件?任何解释将不胜感激。我已经阅读了 WPF 博士的文章,但不明白为什么会发生这种情况。

更新

好的,我想出了一些与我的问题有关的东西。在 UserControl 中,我将 DataContext 设置为自身,以便我可以处理ICommand处理向上和向下按钮的 s。但由于某种我还不明白的原因,它与 ListItem 的数据绑定混淆了!如果 UserControl 包含在 ListItem 中,为什么会发生这种情况?

4

1 回答 1

1

当您在内部将 UserControl 的 DataContext 设置为自身时,您将获得与执行此操作完全相同的效果:

<updown:UpDown DataContext="{Binding RelativeSource={RelativeSource Self}}" />

显然,现在您设置的任何未明确定义 Source 的绑定都将使用 UpDown 控件作为其上下文。因此,当您尝试绑定到 Number 属性时,它会在 UpDown 上查找 Number 属性,而不是 ListBoxItem 的数据。这正是你的错误告诉你的。

为避免这种情况,请将 UserControl 中的 DataContext 设置更改为应用于控件内的元素,例如具有 x:Name 的根布局 Grid。

<Grid x:Name="LayoutRoot">
...
</Grid>

并在代码或 XAML 中设置 DataContext。

LayoutRoot.DataContext = this;
于 2010-07-22T02:55:47.477 回答