2012-11-06 112 views
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> 

我已经尝试了很多事情,包括把与数据网格代替或以及datagridtextcolumns(的ItemSource等)的结合,定义代码的DataContext(我想尽可能地保持了代码为mvvm的原因),使用路径和来源,也试图将我的两个数组在一个类(这不是我真正想要的)。然而,即使下面的简单测试用例正确绑定数据网格,也没有任何工作可做。

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

任何人有任何想法?

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

回答

2

需要绑定到单个源

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

创建

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

绑定数据网格到地址经过

然后在列结合的路径,从和仪表

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

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

0

当你没有任何方法来显示我的东西时,WPF向你介绍了一个非常有用的东西nto查看您的对象。你可以使用转换器。我相信这个转换器系统将帮助你改善你想要的方式。

创建一个转换器,它接受一个数组并返回类似串联项目的字符串或可能是您想要的某个东西。 也做转换从显示值到对象。在两侧同步。

1

对,谢谢你的回答。下面是我如何解决它到底:我在主类

dataGrid1.DataContext = Addresses; 

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

在输入方法主要类

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() 
    { 
    } 
} 

这上面额外的I类明显

需要具有:

<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> 
+0

我知道只是示例代码,但可能会在同一回路做仪表和奴隶。 – Paparazzi

+0

我后来在地址类上做了一些INotifyPropertyChanged工作,并将列表更改为Observatible集合,以使绑定更好地工作。只是想我会说。 –