小编典典

WPF数据绑定问题

all

我是 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}

有没有办法找出列索引或名称?或者有另一种方法来解决这个问题?


阅读 58

收藏
2022-06-27

共1个答案

小编典典

到目前为止,我得到的解决方案是动态添加列并在每一列上设置 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 执行此操作的方法,我将不胜感激。

2022-06-27