【问题标题】:Binding a UserControl to a ListBox ItemSource将 UserControl 绑定到 ListBox ItemSource
【发布时间】:2016-06-10 10:47:47
【问题描述】:

我有一个包含对象列表的 ObservableCollection。

我想将此可观察集合绑定到 ListBox,但不是以每个对象都显示在 ListView 中的方式,而是每个对象创建一个 UserControl,该对象本身作为输入参数。

举一个类似的例子;想象一个服务器浏览器,其中每一行都是一个 UserControl,数据存储在 List/ObservableCollection 中,然后显示在前端 ListBox 中。

我的 MainWindow.xaml 中有这个 XAML 代码

<ListBox HorizontalContentAlignment="Stretch" ItemsSource="{Binding Bills}" ItemContainerStyle="{StaticResource BillStyle}">
</ListBox>

这是调用 UserControl 的样式

<Style TargetType="{x:Type ListBoxItem}" x:Key="BillStyle">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListBoxItem}">
                <ns:BillItem />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

在 MainWindow.xaml.cs 我有:

ObservableCollection<Bill> Bills {get;set;}

在构造函数中我只是添加了一些对象。

我希望 Bill 对象以这种方式推送到用户控件:

UserControl BillItem (Bill BindedObject)
{ ... }

但我不知道该怎么做。

【问题讨论】:

    标签: c# wpf data-binding user-controls


    【解决方案1】:

    如果我理解正确,你需要这样的东西:

    <ItemsControl ItemsSource="{Binding Path=ListOfObjects}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Vertical" />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <local:MyUserControl MyProperty="{Binding}"/>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
    

    MyUserControl 需要有依赖属性,因为你不能传递给构造函数:

    public object MyProperty
    {
        get { return (object)GetValue(MyPropertyProperty); }
        set { SetValue(MyPropertyProperty, value); }
    }
    
    public static readonly DependencyProperty MyPropertyProperty =
        DependencyProperty.Register("MyProperty", typeof(object), typeof(MyUserControl), new PropertyMetadata(false));
    

    【讨论】:

    • 我从来没有想过这个!谢谢你的主意!但是,我在执行时收到以下错误。 '在 'System.Windows.StaticResourceExtension' 上提供值引发了异常。'在 ListBox 行中
    • 我已经修复了鞋面,但是现在如果我使用PropertyMetadata(false),我会得到The type initializer for 'Billing_Components.BillItem' threw an exception.,并且对象引用未设置为对象的实例。如果你不使用PropertyMetadata(false)
    • 当我将 new BillItem() 放入 PropertyMetadata 中时,我得到了一个空对象。
    【解决方案2】:

    在视图上有一个从 ItemsControl 继承的项目,例如列表框,然后将您的对象放在 VM 中的 ObservableCollection 属性中。然后只需绑定到 ItemsControl/listbox 中的该属性或任何 ItemsSource 属性

    ItemSource="{Binding MyObjectCollection}"

    【讨论】:

    • 如何为 ItemSource 中的每个对象创建一个 UserControl?
    • 我已经改变了我的问题,请您检查一下吗?
    • 我不确定我是否理解您为什么希望每个项目都有一个用户控件。假设您希望集合中的每个项目都有一个列表框然后显示它的项目,我是否正确?如果是这样,您最好使用列表框显示所有项目,然后使用第二个列表框显示第一个列表框中所选项目的子项目。
    • UserControl 不包含列表框,它将包含与每一行交互所需的各种按钮(它实际上是与 Access DB 的连接)。因此,我需要将 List 中的对象转发给 UserControl。我已经尝试按照@vlada 所说的进行操作,它可以工作,但是会呈现一个默认对象。
    • 在这种情况下,您需要将用户控件放在 ListboxItem 模板中,并将用户控件设置为将对象作为其数据上下文。这将允许它自行连接,而无需额外的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 2012-06-28
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多