如何在后台代码中为ListView的DisplayMemberPath或ItemTemplate添加Converter?
后台代码为ListView配置带Converter的ItemTemplate
DisplayMemberPath属性本身不支持直接应用Converter,所以我们需要通过后台代码手动创建包含Converter的ItemTemplate来实现需求,替代DisplayMemberPath的用法。
步骤1:定义Converter类
先实现一个示例Converter(根据业务需求修改转换逻辑即可):
public class StringToUpperCaseConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (value is string str) return str.ToUpper(); return value; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } }
步骤2:后台创建ListView并配置ItemTemplate
直接在代码里构建DataTemplate,给TextBlock的Text绑定添加Converter:
// 实例化自定义Converter var myConverter = new StringToUpperCaseConverter(); // 创建ListView实例 var listView = new ListView { ItemsSource = SomeObject, HorizontalAlignment = HorizontalAlignment.Right, SelectionMode = ListViewSelectionMode.Single }; // 创建DataTemplate var dataTemplate = new DataTemplate(); // 构建TextBlock的元素工厂 var textBlockFactory = new FrameworkElementFactory(typeof(TextBlock)); // 设置绑定规则,添加Converter var binding = new Binding { Converter = myConverter, // 如需绑定数据项的特定属性,设置Path,比如 Path = "UserName" // 默认绑定整个数据对象,和XAML中{Binding}的效果一致 }; textBlockFactory.SetBinding(TextBlock.TextProperty, binding); // 将元素工厂关联到DataTemplate dataTemplate.VisualTree = textBlockFactory; // 给ListView设置ItemTemplate listView.ItemTemplate = dataTemplate; // 添加到容器中 var stackPanel = new StackPanel(); stackPanel.Children.Add(listView);
补充说明
- 如果需要绑定数据项的某个具体属性,在Binding的
Path属性中指定属性名称即可 - 上述代码和你提供的XAML示例逻辑完全对应,都是通过DataTemplate包裹带Converter的绑定来实现自定义显示效果
内容的提问来源于stack exchange,提问作者miniHessel
相关产品推荐
相关产品推荐

