ListView数据绑定以显示用户控件

时间:2011-05-06 20:57:00

标签: wpf data-binding listview

我的目标是在WPF ListView中添加不同的Controls / UserControl。控件可以是任何类型。以下是3个不同的Controls / UserControls的示例:

enter image description here

什么工作

如果我使用以下XAML和代码,这将有效:

<ListView Name="ControlsListView">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Control"/>
        </GridView>
    </ListView.View>
</ListView>

以下是代码:

ObservableCollection<Control> Controls { get; set; }
//...
ControlsListView.ItemsSource = Controls;
//...
Controls.Add(new ThresholdControl());
Controls.Add(new CheckBox());
Controls.Add(new Button()
                     {
                        Content = "Test"
                     });

什么不工作

我的问题是当我想在ObservableCollection中添加一个间接级别时。我想拥有一个MyItem集合,而不是直接使用Control集合。 MyItem本身包含要显示的控件。像这样:

class MyItem
{
    public Control MyControl { get; set; }
}

ObservableCollection<MyItem> Controls { get; set; }

我会像这样绑定我的ListView:

<GridViewColumn Header="Control" DisplayMemberBinding="{Binding MyControl}"/>

显示字符串时,这样可以正常工作,但是对于显示控件,这将不起作用。实际上,在我的示例中,它将显示表示插入到列表中的Control类而不是Control本身的字符串。

我需要做什么才能绑定到列表中的控件? DisplayMemberBinding似乎不是这里的好选择。

谢谢!

1 个答案:

答案 0 :(得分:4)

您想要使用CellTemplate属性而不是DisplayMemberBinding。然后,您可以让CellTemplate显示您想要的控件。我认为代码看起来像这样:

<ListView Name="ControlsListView">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Control">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <ContentControl Content={Binding MyControl} />
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>