更改ItemsSource后,DataGrid不会更新

时间:2014-06-26 10:07:50

标签: wpf datagrid itemssource

我有一个绑定到ObservableCollection对象的数据网格。 在一个事件中,我清除ObservableCollection并向其添加新项。 完成后,我尝试更新DataGrid,但它仍然显示旧行。 我究竟做错了什么? 这是我的XAML:

<DataGrid 
   ItemsSource="{Binding }" 
   AutoGenerateColumns="False" 
   Name="dgvCurrentFaults" 
   TabIndex="0" 
   Background="Transparent" 
   RowBackground="#B4CDCD" 
   Foreground="#314E54" >
   <DataGrid.Columns>
      <DataGridTemplateColumn Header="Icon" Width="70" IsReadOnly="True">
         <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
               <Image Source="{Binding Icon}" Width="20" Height="20"/>
            </DataTemplate>
         </DataGridTemplateColumn.CellTemplate>
      </DataGridTemplateColumn>
      <DataGridHyperlinkColumn  Header="Display" Binding="{Binding Display}" ContentBinding="{Binding Display}" IsReadOnly="True">
         <DataGridHyperlinkColumn.ElementStyle>
            <Style>
               <EventSetter Event="Hyperlink.Click" Handler="dgvCurrentFaults_CellContentClick"/>
            </Style>
         </DataGridHyperlinkColumn.ElementStyle>
      </DataGridHyperlinkColumn>
      <DataGridTextColumn Header="Fault Name" Binding="{Binding Falut_Name}" Width="150" IsReadOnly="True">
         <DataGridTextColumn.ElementStyle>
            <Style TargetType="TextBlock">
               <Setter Property="TextWrapping" Value="Wrap"/>
            </Style>
         </DataGridTextColumn.ElementStyle>
      </DataGridTextColumn>
      <DataGridTextColumn Header="Description" Binding="{Binding Fault_Description}" Width="240" IsReadOnly="True">
         <DataGridTextColumn.ElementStyle>
            <Style TargetType="TextBlock">
               <Setter Property="TextWrapping" Value="Wrap"/>
            </Style>
         </DataGridTextColumn.ElementStyle>
      </DataGridTextColumn>
      <DataGridTextColumn Header="Action Required" Binding="{Binding ActionRequired}" Width="200" IsReadOnly="True">
         <DataGridTextColumn.ElementStyle>
            <Style TargetType="TextBlock">
               <Setter Property="TextWrapping" Value="Wrap"/>
            </Style>
         </DataGridTextColumn.ElementStyle>
      </DataGridTextColumn>
      <DataGridTextColumn Header="ID Fault" Binding="{Binding IDFault}" Visibility="Hidden" IsReadOnly="True"/>
   </DataGrid.Columns>
</DataGrid>

这是我的代码

public ObservableCollection<FaultsInfo> infoFaultList { get; set; }

private void UpdateTable()
{
    infoFaultList.Clear();
    infoFaultList.Add(new infoFault(1));
    infoFaultList.Add(new infoFault(2));

    dgvCurrentFaults.ItemsSource = null;
    dgvCurrentFaults.ItemsSource = infoFaultList;
    dgvCurrentFaults.UpdateLayout();
    dgvCurrentFaults.Items.Refresh();
}

编辑:

在对主题进行更多查看后,我发现第一次更新DataGrid是在UserControl的Loaded事件上。在这种情况下,DataGrid更新正常。 稍后,DataGrid会更新某些通信启动的事件。在那种情况下,它不是原始的。 我想也许问题是我尝试从另一个线程更新它,虽然我使用Invoke。

2 个答案:

答案 0 :(得分:0)

我的source属性是一个可观察的集合,您不需要再次设置它。您不需要此代码:

dgvCurrentFaults.ItemsSource = null;
dgvCurrentFaults.ItemsSource = infoFaultList;

此外,上面的代码也不起作用,因为该类必须实现INotifyPropertyChanged接口:

ObservableCollection<FaultsInfo> _infoFaultList;
public ObservableCollection<FaultsInfo> infoFaultList
{
    get
    {
        return _infoFaultList;        
    }
    set
    {
        _infoFaultList = value;
        NotifyPropertyChanged("infoFaultList");
    }
}

您还需要检查绑定是否正常。如果您的xaml代码是正确的,那么数据网格的数据上下文应该是绑定之前的集合,就像您使用它一样:ItemsSource="{Binding }"。如果集合不是数据上下文,那么您应该修复绑定并制作一个类似ItemsSource="{Binding InfoFaultList}"的内容。

希望这有帮助。

答案 1 :(得分:0)

 public ObservableCollection<FaultsInfo> infoFaultList { get; set; }

        public MainWindow2()
        {
            InitializeComponent();
            infoFaultList = new ObservableCollection<FaultsInfo>();
            infoFaultList.Add(new FaultsInfo(5));
            infoFaultList.Add(new FaultsInfo(6));
            dgvCurrentFaults.ItemsSource = infoFaultList;
            dgvCurrentFaults.UpdateLayout();
        }

        private void UpdateTable()
        {
            infoFaultList.Clear();
            infoFaultList.Add(new FaultsInfo(1));
            infoFaultList.Add(new FaultsInfo(2));
            dgvCurrentFaults.ItemsSource = null;
            dgvCurrentFaults.ItemsSource = infoFaultList;
            dgvCurrentFaults.UpdateLayout();
            dgvCurrentFaults.Items.Refresh();
        }

        private void btnName_Click_1(object sender, RoutedEventArgs e)
        {
            UpdateTable();
        }

XAML代码

 <StackPanel Orientation="Vertical">
    <Grid>
        <DataGrid 
   ItemsSource="{Binding }" 
   AutoGenerateColumns="False" 
   Name="dgvCurrentFaults" 
   TabIndex="0" 
   Background="Transparent" 
   RowBackground="#B4CDCD" 
   Foreground="#314E54" >
            <DataGrid.Columns>
                <!--<DataGridTemplateColumn Header="Icon" Width="70" IsReadOnly="True">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Image Source="{Binding Icon}" Width="20" Height="20"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>-->
                <DataGridHyperlinkColumn  Header="Display" Binding="{Binding Display}" ContentBinding="{Binding Display}" IsReadOnly="True">
                </DataGridHyperlinkColumn>
                <DataGridTextColumn Header="Fault Name" Binding="{Binding Falut_Name}" Width="150" IsReadOnly="True">
                    <DataGridTextColumn.ElementStyle>
                        <Style TargetType="TextBlock">
                            <Setter Property="TextWrapping" Value="Wrap"/>
                        </Style>
                    </DataGridTextColumn.ElementStyle>
                </DataGridTextColumn>
                <DataGridTextColumn Header="Description" Binding="{Binding Fault_Description}" Width="240" IsReadOnly="True">
                    <DataGridTextColumn.ElementStyle>
                        <Style TargetType="TextBlock">
                            <Setter Property="TextWrapping" Value="Wrap"/>
                        </Style>
                    </DataGridTextColumn.ElementStyle>
                </DataGridTextColumn>
                <DataGridTextColumn Header="Action Required" Binding="{Binding ActionRequired}" Width="200" IsReadOnly="True">
                    <DataGridTextColumn.ElementStyle>
                        <Style TargetType="TextBlock">
                            <Setter Property="TextWrapping" Value="Wrap"/>
                        </Style>
                    </DataGridTextColumn.ElementStyle>
                </DataGridTextColumn>
                <DataGridTextColumn Header="ID Fault" Binding="{Binding IDFault}" Visibility="Hidden" IsReadOnly="True"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
        <Button x:Name="btnName"  Width="100" Height="100" Content="Click Me" Click="btnName_Click_1"/>
    </StackPanel>

上面是我的代码,它的工作正常没有问题你可以按照提供的语法。在上面的代码测试过程中,我知道每当我清除infoFaultList或将其设置为null时,我们必须像这样重新初始化。

infoFaultList=new ObservableCollection<FaultsInfo>();