2012-05-17 122 views
1

我有一个类“Seive”,一个ObservableCollection seiveData对象。C#WPF:填充DataGrid失败

 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> 

在窗口中加载事件,我填2个seives在seiveData,但我没有看到任何结果/行。

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的所有细节,但不是插入符号&重量加到第0个seive。

+0

听说过INotifyPropertyChanged'的'?非常重要的这样的需求界面。 –

回答

2

我在你的xaml中看到的基本问题是你设置了ItemsSource = {binding SeiveData} 这是错误的,如果你将这个属性传递到网格的数据上下文中。

以下代码正在运行。核实。

一件事,如果你想将chagnes通知到类钛硅分子筛则必须实现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; } 
    } 
+0

谢谢。我在我的Seive类中实现了INotifyPropertyChange,并且它工作正常。再次感谢。 – Tvd

1

你提到你正在使用一个列表,但为了让数据绑定起作用,你需要使用ObservableCollection<T>,如果集合发生变化,你将需要通知数据网格。

编辑:

正如在评论中指出的,这不是关于变化。您已经将datacontext设置为列表,因此DataContext中不会有seiveData。相反,尝试以下操作:

ItemsSource="{Binding}"

如果您仍然需要通知您的变化来看,由于已经提到考虑ObservableCollection<T>

+1

但问题不在于变化,问题在于填充数据网格。 –

+0

我将List更改为ObservableCollection,但没有区别。 – Tvd

+0

在Loaded事件中,我用ItemSource替换了Datacontext,因为你是mentioend,是的,我可以看到数据。但我的观点不仅仅是添加,我也可以动态添加/更改。在btn点击中,我添加了一个新的Seive并更改了第0个seive的一些值,并将其命名为.DataContenxt = seivesData ;.新添加的seive已在数据网格中更新/显示,但第0个对象的更新值未刷新。为什么这样 ? – Tvd

0

可能DataGrid所在的容器的DataContext未设置为服务于seiveData属性的对象。或者你的seiveData -list甚至不支持属性,但只是一个字段。这是不允许的。即使字段(成员变量)被声明为公共,绑定引擎也不会绑定到它 - 它必须由一个属性支持。

另请注意,如果您在Loaded事件中填写列表,则seiveList必须是INotifyCollectionChanged-实施集合,例如ObservableCollection<T>,因为绑定是在列表的群体之前完成的。否则,DataGrid将不知道新数据已被插入到列表中。