我是 WPF 新手,在尝试使用自定义对象列表填充 ListView 时遇到了一些困难。
internal class ApplicationCode { public int Code { get; set; } public IEnumerable<string> InstrumentCodes { get; set; } }
我有一个 ApplicationCode 列表,我将其设置为 ItemsSource 到 ListView。我需要将 ApplicationCode.Code 显示为字符串,并为其余列显示一个复选框,根据列名是否包含在 InstrumentCodes 集合中,可以选中/取消选中该复选框。
为了设置复选框,我在数据绑定上使用了转换器:
<DataTemplate x:Key="InstrumentCodeTemplate"> <CheckBox IsEnabled="False" IsChecked="{Binding Mode=OneTime, Converter={StaticResource InstrumentSelectionConverter}}" /> </DataTemplate>
我遇到的问题是因为在单元格数据绑定时我不知道哪一列是当前列,并且我无法设置 ConverterParameter。
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { ApplicationCode appCode = value as ApplicationCode; return appCode != null && appCode.InstrumentCodes.Contains(parameter.ToString()); }
小例子:
Id | Code1 | Code3 | Code4 -------------------------------- 123 | True | False | True
第 1 行的数据:ApplicationCode.InstrumentCodes {Code1, Code4}
有没有办法找出列索引或名称?或者有另一种方法来解决这个问题?
到目前为止,我得到的解决方案是动态添加列并在每一列上设置 ConverterParameter。
foreach (var instrument in instruments) { var column = new GridViewColumn { HeaderTemplate = GetColumnHeaderTemplate(instrument), CellTemplate = GetColumnCellTemplate(instrument), Header = instrument, }; view.Columns.Add(column); } private static DataTemplate GetColumnCellTemplate(string instrument) { var binding = new Binding { ConverterParameter = instrument, Converter = new InstrumentSelectionConverter(), Mode = BindingMode.OneWay }; var template = new DataTemplate(); template.VisualTree = new FrameworkElementFactory(typeof(CheckBox)); template.VisualTree.SetBinding(ToggleButton.IsCheckedProperty, binding); return template; }
我知道这不是最好的解决方案,如果有人能告诉我一种直接从 .xaml 执行此操作的方法,我将不胜感激。