0

我一直在尝试将 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

4 回答 4

2

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

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

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

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

第二个问题是您不应该像这样将 DataColumn 绑定到继承的数据上下文的独立属性 - 它需要绑定到您已绑定到网格的 ItemsSource 的IEnumerable 中包含的项目的属性. 这是另一个示例

希望这些链接会有所帮助,它们至少应该让您入门。

于 2012-11-06T13:07:00.600 回答
2

需要绑定到单个源

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

创造

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

将 DataGrid 绑定到地址

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

于 2012-11-06T13:09:02.030 回答
1

Right, thanks for your answers. Here's how I solved it in the end:

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

in my main class

dataGrid1.DataContext = Addresses;

in entry method to main class

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);
}

in my entry method to show i can easily populate and edit this list

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

    public Address()
    {
    }
}

and this above as the extra class I needed obviously

with:

<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>
于 2012-11-06T14:22:19.853 回答
0

当您无法将事物显示到您的对象的视图中时,WPF 为您介绍了一个非常有用的东西。你可以使用转换器。我相信这个转换器系统将帮助您以您想要的方式进行微调。

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

于 2012-11-06T13:23:52.837 回答