如何让WPF的ListBox显示列表中的不同UIElement元素
在WPF ListBox的DataTemplate中绑定UIElement属性显示对应控件
你已经通过代码创建了TextBlock、Ellipse、Rectangle等UI元素,封装进UIElementItem列表并绑定给ListBox的ItemsSource,现在要在DataTemplate中绑定uiElement属性来显示对应的UI控件,只需要使用ContentControl即可实现。
解决方案
将XAML中???的位置替换为ContentControl,并将其Content属性绑定到uiElement:
<ListBox Name="lbListBox" HorizontalContentAlignment="Stretch"> <ListBox.ItemTemplate> <DataTemplate> <StackPanel Margin="0,2" Orientation="Horizontal"> <TextBlock Text="{Binding Text}"/> <ContentControl Content="{Binding uiElement}"/> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox>
原理说明
ContentControl是WPF中专门用于显示任意内容的控件,它的Content属性可以接受任何UIElement类型的对象,WPF会直接将这个UI元素渲染到界面上,不需要额外定义模板。
可选优化(规范建议)
按照C#的命名规范,建议将UIElementItem类的属性名改为大驼峰格式,提升代码可读性:
public class UIElementItem { public UIElement UiElement { get; set; } public string Text { get; set; } }
对应的绑定也需要修改为:
<ContentControl Content="{Binding UiElement}"/>
内容的提问来源于stack exchange,提问作者M Ahmadzadeh
相关产品推荐
相关产品推荐

