C# 如何使用代码隐藏将 类 的数据网格 t observableCollection 与可观察集合绑定

C# how to bind a datagrid t observableCollection of classes with observable collections using code behind

我有一个数据网格,它必须与以下 class 的可观察集合相关联:

public class CfgCounters
{
    public int valuePresent { get; set; }
    public string Name { get; set; }
    public ObservableCollection<DateTime> obcDatetime { get; set; }
    public ObservableCollection<string> obcLastExecutedPP { get; set; }
    public ObservableCollection<int> obcNumDimsOK { get; set; }
}

因此我

ObservableCollection<CfgCounters> obcCounters = new ObservableCollection<CfgCounters>();

我用实例填充,然后用 dtg.ItemsSource = obcCounters;

关联到 dtg

结果是

这显然没有以任何方式显示 obc。 所以问题是:我如何在代码隐藏中显示(以任何方式会做)那些可观察的集合仅使用代码隐藏? 谢谢

您的数据是分层的,而您的视图不是。您可能正在寻找:

  1. TreeView 显示分层数据

  2. 或者您可以展平数据并将其用作数据网格的源。代码示例显示了从数据模型继承的视图模型,但也可以将代码隐藏转换为新类型。

  3. Datagrid 也可以对列表进行分组。但这不适合这里,参见 2.


当 csv 在 运行 时间没有改变时:

public class CfgCountersViewModel : CfgCounters
{

    public string obcDatetimeCsv => String.Join(",", obcDatetime);
    ...
}

或者当 CfgCounters 的子项在 运行 时间内发生变化时,更复杂的事情如:

public class CfgCountersViewModel : CfgCounters, INotifyPropertyChanged
{
    public CfgCountersViewModel() 
    {
         // UpdateObcDatetimeCsv when obcDatetime changes
         obcDatetime.OnCollectionChanged += (sender, args) => 
         {
              obcDatetimeCsv = String.Join(",", obcDatetime);
         }
    }
    ...
}

您应该将每个 CfgCounters 对象转换为仅具有标量属性的项目,例如:

ObservableCollection<CfgCounters> obcCounters = new ObservableCollection<CfgCounters>();
...
dtg.ItemsSource = obcCounters.Select(x => new
{
    x.valuePresent,
    x.Name,
    obcDatetime = string.Join(",", x.obcDatetime.Select(y => y.ToString("yyyy-MM-dd"))),
    obcLastExecutedPP = string.Join(",", x.obcLastExecutedPP),
    obcNumDimsOK = string.Join(",", x.obcNumDimsOK)
}).ToArray();