我一直在尝试将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 };
有人有任何想法吗?
是的,也许我应该把我的解决方案放在这里,但它有点长,所以我把它作为答案。无论如何,这是多种方式中的一种,如果你有这种倾向,可以发布另一个答案。
答案 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 grid。 Here 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会向您介绍一个非常有用的内容。你可以使用转换器。我相信这个转换器系统可以帮助您按照自己的方式进行操作。
创建一个转换器,它接受一个数组并返回类似串联项的字符串,或者可能是你想要的东西。 并且还可以将显示值转换回对象。用于双方同步。