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。
所以问题是:我如何在代码隐藏中显示(以任何方式会做)那些可观察的集合仅使用代码隐藏?
谢谢
您的数据是分层的,而您的视图不是。您可能正在寻找:
TreeView 显示分层数据。
或者您可以展平数据并将其用作数据网格的源。代码示例显示了从数据模型继承的视图模型,但也可以将代码隐藏转换为新类型。
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();
我有一个数据网格,它必须与以下 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。 所以问题是:我如何在代码隐藏中显示(以任何方式会做)那些可观察的集合仅使用代码隐藏? 谢谢
您的数据是分层的,而您的视图不是。您可能正在寻找:
TreeView 显示分层数据。
或者您可以展平数据并将其用作数据网格的源。代码示例显示了从数据模型继承的视图模型,但也可以将代码隐藏转换为新类型。
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();