我有一个绑定到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。
答案 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>();