c# - 双向绑定数据网格 wpf xaml
问题描述
我想将 CLR 属性绑定到 datagrid Row 如何在 datagrid(Twoway 模式)中绑定行代码 隐藏:
public partial class TechnicalPropertiesU_Var : Window
{
public TechnicalPropertiesU_Var()
{
InitializeComponent();
List<Myclass> myclassList = new List<Myclass>();
myclassList.Add(new Myclass() { IA = 0, IB = 0, IC = 0, ID = 0, IE = 0, IF = 0, IF = 0 });
MyGrid.ItemsSource = myclassList;
}
}
我的窗口 Xaml:
<Grid>
<DataGrid x:Name="MyGrid" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Argument Name"></DataGridTextColumn>
<DataGridTextColumn Header="Argument Value"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
模型类
public class Myclass
{
private int iA;
private int iB;
private int iC;
private int iD;
private int iE;
private int iF;
private int iG;
public int IA{get=>iA; set=>iA =value;}
public int IB{get=>iB; set=> iB =value;}
public int IC{get=>iC; set=> iC =value;}
public int ID{get=>iD; set=> iD =value;}
public int IE{get=>iE; set=> iE =value;}
public int IF{get=>iF; set=> iF =value;}
public int IG{get=>iG; set=> iG =value;}
}
如何获取数据网格字段中的特定列。请提供任何样品
解决方案
如果您尝试获得的结果是一个包含两列的表格(请参见您的图片),那么我猜您显然混淆了行和列。您的数据类必须具有两个属性:ArgumentName
和ArgumentValue
。您必须知道每个项目(或 的每个实例MyClass
)都将显示为一行。现在,为每一行创建一个 of 的实例MyClass
并将其添加到源集合中。将该DataGridTextColumn.Binding
属性绑定到模型的列的相关属性MyClass
。
以下示例将显示图像中的表格:
MyTableClass.cs
public class MyTableClass : INotifyPropertyChanged
{
public MyTableClass(int argumentName, int argumentValue)
{
this.ArgumentName = argumentName;
this.ArgumentValue = argumentValue;
}
private int argumentName;
private int argumentValue;
public int ArgumentName{get=>argumentName; set{argumentName=value; NotifyPropertyChanged();}}
public int ArgumentValue{get=>argumentValue; set{argumentValue=value; NotifyPropertyChanged();}}
public event PropertyChangedEventHandler PropertyChanged;
// This method is called by the Set accessor of each property.
// The CallerMemberName attribute that is applied to the optional propertyName
// parameter causes the property name of the caller to be substituted as an argument.
private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
TechnicalPropertiesU_Var.xaml.cs
public partial class TechnicalPropertiesU_Var : Window
{
public TechnicalPropertiesU_Var()
{
InitializeComponent();
List<MyTableClass> myTableClasses = new List<MyTableClass>();
myTableClasses.Add(new MyTableClass() { ArgumentName = "IA", ArgumentValue = 5 });
myTableClasses.Add(new MyTableClass() { ArgumentName = "IB", ArgumentValue = 3 });
myTableClasses.Add(new MyTableClass() { ArgumentName = "IC", ArgumentValue = 2 });
myTableClasses.Add(new MyTableClass() { ArgumentName = "ID", ArgumentValue = 0 });
MyGrid.ItemsSource = myTableClasses;
}
}
我的窗口.xaml
<Grid>
<DataGrid x:Name="MyGrid" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Argument Name" Binding="{Binding ArgumentName}"></DataGridTextColumn>
<DataGridTextColumn Header="Argument Value" Binding="{Binding ArgumentValue}"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
解决您的评论:“我不想绑定参数名称和参数值属性。我想绑定我自己的 CLR 属性。因为我有 250 个变量。”
我不必了解您的意图就可以告诉您这是一个坏主意。一个类不应该有 250 个属性。您的图像清楚地表明,并非所有 250 个属性都有关系,但只有两个有关系。
在您的情况下,数据由一个字符串值(例如)"IA"
和一个数值(例如)组成5
。你应该改变你的班级来反映这一点。
您应该知道,在常见的关系数据库设计中,数据记录由一行表示。每一行是一个对象,这一行的每一列是该对象的一个属性。DataGrid´ is designed with the same intention: each row is an item of the
DataGrid.ItemsSource` 。每个项目都是一个单独的实例。通常从左到右读取任何表格,例如产品价格表,其中行的每一列都预期与单个数据项(例如产品)相关。
我强烈建议您放弃最初的意图并更改数据类以反映数据的关系,例如示例MyTableClass
反映了具有两个属性(列)的数据对象(行)的关系。
推荐阅读
- arrays - 如何使用 pyspark 在 aws 胶水中展平嵌套 json 中的数组?
- mongodb - 在带有嵌套文档和嵌套 atrrays mongodb 的文档中搜索
- css - 在 CSS 中概述混合的字母和数字计数器
- excel - 在不同工作表的多个单元格中粘贴相同的值
- javascript - 使用 XMLHttpRequest 下载文件后如何显示消息?
- google-sheets - Google 表格条目默认值
- android - 未解决参考。安卓科特林
- python - 如何在 python flask postgresql 中基于天、周聚合
- php - Foreach 循环跳转数据库中写入数组的一部分
- facebook-graph-api - 如何获取页面推荐上发布的所有评论?