将UserControl绑定到ListBox ItemSource

时间:2016-06-10 10:47:47

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

我有一个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)
{ ... }

但我不知道该怎么做。

2 个答案:

答案 0 :(得分: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));

答案 1 :(得分:0)

视图上的

有一个继承自ItemsControl的项目,例如listbox,然后将对象放在VM中的ObservableCollection属性中。然后简单地绑定到ItemsControl / listbox中的该属性或whatevers ItemsSource属性

ItemSource =“{Binding MyObjectCollection}”