我有一个“Seive”类,一个ObservableCollection seiveData对象。
public Seive(String id)
{
SeiveIdSize = id;
Caret = 0.0;
Percent = 0.0;
Peices = 0;
Weight = 0.0;
Size = 0;
}
public String SeiveIdSize { get; set; }
public Double Weight { get; set; }
public Double Percent { get; set; }
public Double Caret { get; set; }
public uint Size { get; set; }
public uint Peices { get; set; }
在我的xml中:我有
<DataGrid Name="serverGrid" ItemsSource="{Binding}" .....>
<DataGrid.Columns>
<DataGridTextColumn Header="SEIVE" Width="Auto" Binding="{Binding Path=SeiveIdSize}" SortDirection="Ascending" />
<DataGridTextColumn Header="CTS" Width="Auto" Binding="{Binding Path=Caret}" />
<DataGridTextColumn Header=" % " Width="Auto" Binding="{Binding Path=Percent}" />
<DataGridTextColumn Header="PCS" Width="Auto" Binding="{Binding Path=Peices}" />
<DataGridTextColumn Header="WGT" Width="Auto" Binding="{Binding Path=Weight}" />
<DataGridTextColumn Header="SIZE" Width="Auto" Binding="{Binding Path=Size}" />
</DataGrid.Columns>
在窗口Loaded事件中,我在seiveData中填充了2个seive,但是我没有看到任何结果/行。
seivesData.Add(new Seive("+10"));
seivesData.Add(new Seive("+8"));
seivesDataGrid.DataContext = seivesData;
编辑: 按钮事件代码:
private void saveBtn_Click(object sender, RoutedEventArgs e)
{
Seive s1 = new Seive("+2");
s1.Peices = 100;
s1.Caret = 0.41;
s1.Weight = 0.10;
seivesData.Add(s1);
Seive s = seivesData[0];
s.Caret = 0.54;
s.Weight = 0.32;
seivesData[0] = s;
seiveDG.DataContext = seivesData;
}
我哪里错了?我可以看到新添加的Seive所有细节,但Not the Caret&amp;重量加到第0位。
答案 0 :(得分:2)
我在你的xaml中看到的基本问题是你设置了ItemsSource = {binding SeiveData} 如果将此属性传递到网格的数据上下文中,则会出错。
以下代码现在正在运行。核实。
如果你想将chagnes通知给Seive类,那么还有一件事就是必须实现INotifyPropertyChange接口。
XAML
<DataGrid Name="serverGrid" ItemsSource="{Binding}">
<DataGrid.Columns>
<DataGridTextColumn Width="Auto"
Binding="{Binding Path=SeiveIdSize}"
Header="SEIVE"
SortDirection="Ascending" />
<DataGridTextColumn Width="Auto"
Binding="{Binding Path=Caret}"
Header="CTS" />
<DataGridTextColumn Width="Auto"
Binding="{Binding Path=Percent}"
Header=" % " />
<DataGridTextColumn Width="Auto"
Binding="{Binding Path=Peices}"
Header="PCS" />
<DataGridTextColumn Width="Auto"
Binding="{Binding Path=Weight}"
Header="WGT" />
<DataGridTextColumn Width="Auto"
Binding="{Binding Path=Size}"
Header="SIZE" />
</DataGrid.Columns>
</DataGrid>
落后于
ObservableCollection<Seive> _seiveData;
public ObservableCollection<Seive> SeiveData
{
get { return _seiveData; }
set { _seiveData = value; }
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
SeiveData = new ObservableCollection<Seive>();
SeiveData.Add(new Seive("+10"));
SeiveData.Add(new Seive("+8"));
serverGrid.DataContext = SeiveData;
}
上课
public class Seive
{
public Seive(String id)
{
SeiveIdSize = id;
Caret = 0.0;
Percent = 0.0;
Peices = 0;
Weight = 0.0;
Size = 0;
}
public String SeiveIdSize { get; set; }
public Double Weight { get; set; }
public Double Percent { get; set; }
public Double Caret { get; set; }
public uint Size { get; set; }
public uint Peices { get; set; }
}
答案 1 :(得分:1)
您提到您正在使用列表,但是为了使数据绑定工作,您需要使用ObservableCollection<T>
,如果集合发生更改,它将通知数据网格。
编辑:
正如评论中所指出的,这不是关于变化的。您已经将datacontext设置为列表,因此DataContext中不会有seiveData
。相反,请尝试以下方法:
ItemsSource="{Binding}"
如果您仍需要通知您对更改的看法,请考虑已提及的ObservableCollection<T>
。
答案 2 :(得分:0)
容器的DataContext(DataGrid所在的)可能不会设置为提供seiveData
- 属性的对象。或者您的seiveData
- 列表甚至不是由属性支持,而只是一个字段。这是不允许的。即使字段(成员变量)被声明为public,绑定引擎也不会绑定它 - 它必须由属性支持。
另请注意,如果您填写Loaded-event中的列表,seiveList
必须是INotifyCollectionChanged
- 实施集合,例如ObservableCollection<T>
,因为绑定是在人口之前完成的。名单。否则,DataGrid将不知道新数据已插入列表中。
答案 3 :(得分:0)
每个人所说的一种方法是将其绑定到ObservableCollection
。
另一种方法是从DataTable绑定。
使用
将列表转换为DataTableHow to: Implement CopyToDataTable Where the Generic Type T Is Not a DataRow
我今天发现了这个。非常有效。