我的目标是在WPF ListView中添加不同的Controls / UserControl。控件可以是任何类型。以下是3个不同的Controls / UserControls的示例:
什么工作
如果我使用以下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似乎不是这里的好选择。
谢谢!
答案 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>