首页 > 解决方案 > 双向绑定数据网格 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;}
}

如何获取数据网格字段中的特定列。请提供任何样品

标签: c#wpfdata-bindingdatagridtwo-way-binding

解决方案


如果您尝试获得的结果是一个包含两列的表格(请参见您的图片),那么我猜您显然混淆了行和列。您的数据类必须具有两个属性:ArgumentNameArgumentValue。您必须知道每个项目(或 的每个实例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反映了具有两个属性(列)的数据对象(行)的关系。


推荐阅读