绑定datagrid

时间:2012-11-06 12:51:48

标签: c# wpf data-binding binding datagrid

我一直在尝试将DataGridTextColumns列式地绑定到数组(我认为是int [])并且一直没有成功。我在msdn,stackoverflow等上找到的任何东西都特别有帮助。

<DataGrid AutoGenerateColumns="False" VerticalAlignment="Top" Margin="0,47,0,0" Height="351" Name="dataGrid1" IsReadOnly="True" CanUserAddRows="False" CanUserDeleteRows="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Slave Address" Width="100" Binding="{Binding SlaveAddressValues}"/>
        <DataGridTextColumn Header="Meter Readings" Width="100" Binding="{Binding MeterReadingValues}"/>
    </DataGrid.Columns>
</DataGrid>

我尝试过很多东西,包括用datagrid绑定或者用datagridtextcolumns(itemsource等),在代码中定义datacontext(我想尽可能多地保留代码,因为mvvm的原因) ,使用路径和源,并尝试在一个类中组合我的两个数组(这不是我真正想要的)。但是,即使是以下简单的测试用例也无法正确绑定数据网格。

private int[] SlaveAddressValues = { 0, 0, 0, 0 };
private int[] MeterAddressValues = { 2, 2, 2, 3 };

有人有任何想法吗?

是的,也许我应该把我的解决方案放在这里,但它有点长,所以我把它作为答案。无论如何,这是多种方式中的一种,如果你有这种倾向,可以发布另一个答案。

4 个答案:

答案 0 :(得分:2)

首先,您无法绑定到私有字段,您需要将它们设为公共属性:

private int[] _slaveAddressValues = { 0, 0, 0, 0 };

public int[] SlaveAddress 
{
    get { return _slaveAddressValues; }
    set { _slaveAddressValues = value; }
}

(请注意,我省略了属性设置通知。)

第二个问题是您不应该将DataColumn绑定到继承的数据上下文的独立属性,例如,它必须是bound to a property of the item contained in the IEnumerable,您已绑定到ItemsSource of the gridHere is another sample

希望这些链接会有所帮助,它们至少应该让你开始。

答案 1 :(得分:2)

需要绑定到单个来源

class  Address
{
    public Int Slave { get; set; }
    public Int Meter { get; set; }
}

创建

Public List<Address>  Addresses { get; set; }

将DataGrid绑定到Adddress

然后在列上绑定Slave和Meter的路径

答案 2 :(得分:1)

是的,谢谢你的回答。以下是我最终解决的问题:

public List<Address> Addresses = new List<Address>();

在我的主要班级

dataGrid1.DataContext = Addresses;

在主类的入门方法

for(int i=0; i<10; i++)
{
    Addresses.Add(new Address(){Meter = "",Slave = i});
}

for (int i = 0; i < 10; i++)
{
    Addresses[i].Meter = Convert.ToString(i);
}

在我的输入方法中显示我可以轻松填充和编辑此列表

   public class Address
{
    public int Slave { get; set; }
    public string Meter { get; set; }

    public Address()
    {
    }
}

以上作为我需要的额外课程

使用:

<DataGrid Name="dataGrid1" ItemsSource="{Binding}">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Slave Address" Binding="{Binding Path=Slave}"/>
                <DataGridTextColumn Header="Meter Readings" Binding="{Binding Path=Meter}"/>
            </DataGrid.Columns>
        </DataGrid>

答案 3 :(得分:0)

当您无法将对象显示到对象的视图中时,WPF会向您介绍一个非常有用的内容。你可以使用转换器。我相信这个转换器系统可以帮助您按照自己的方式进行操作。

创建一个转换器,它接受一个数组并返回类似串联项的字符串,或者可能是你想要的东西。 并且还可以将显示值转换回对象。用于双方同步。