刷新WPF项目集合中的单个项目
本文关键字:项目 单个 集合 WPF 刷新 | 更新日期: 2023-09-27 18:25:20
我有一个绑定到某些XML数据的DataGrid。
当我对XML数据进行更改时,DataGrid不会刷新以反映这些更改。
我解决这个问题的"简单"方法是每次进行更改时调用MyDataGrid.Items.Refresh()。
然而,这是滞后的,似乎效率相当低。
如何仅刷新单个行,而不是整个数据网格?我可以很容易地访问DataGridRow以及更改的XmlElement,但我只是不知道该调用什么函数。
我已经为这个问题困扰了3-4个小时,并尝试了几十种解决方案,但都无法解决。
以下是相关代码。
A) 定义样式。
<!-- Field Value Style -->
<local:FieldValueConverter x:Key="FieldValueConverter"/>
<local:Node x:Key="Node"/>
<Style x:Key="fieldValueStyle" TargetType="{x:Type TextBlock}">
<Setter Property="Text" Value="{Binding ., Converter={StaticResource FieldValueConverter}}"/>
<Setter Property="KeyboardNavigation.IsTabStop" Value="False"/>
<Setter Property="Focusable" Value="False"/>
</Style>
B) 定义DataGrid
<DataGrid x:Name="FieldPanelDataGrid" DockPanel.Dock="Left"
AutoGenerateColumns="False"
DataContext="{Binding ElementName=ObjectPanelListBox, Path=SelectedItem}"
ItemsSource="{Binding}"
IsSynchronizedWithCurrentItem="True"
IsReadOnly="True"
CanUserResizeRows="False"
CanUserResizeColumns="True"
KeyboardNavigation.IsTabStop="False"
Visibility="Visible"
SelectionMode="Single">
<DataGrid.Resources>
<Style TargetType="DataGridRow">
<EventSetter Event="MouseDoubleClick" Handler="FieldCell_MouseDoubleClick"/>
<EventSetter Event="PreviewMouseLeftButtonDown" Handler="FieldCell_PreviewMouseLeftButonDown"></EventSetter>
<EventSetter Event="PreviewKeyDown" Handler="FieldCell_PreviewKeyDown"></EventSetter>
</Style>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn x:Name="FieldName" Header="Name" CanUserSort="False" ElementStyle="{StaticResource fieldNameStyle}"/>
<DataGridTextColumn x:Name="FieldValue" Header="Value" Width="*" ElementStyle="{StaticResource fieldValueStyle}"/>
</DataGrid.Columns>
</DataGrid>
我建议使用ObservableCollection作为ItemSource,并且Observable Collection中的条目必须实现INotifyPropertyChanged。然后,如果行发生更改,ObservableCollection将告知您的UI,它将更新。
示例:
您的入门级:
public class MyXmlObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string fieldName;
public string FieldName
{
get { return fieldName; }
set
{
fieldName = value;
NotifyPropertyChanged("FieldName");
}
}
NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
UserControl的代码(ViewModel、Controller或code-behind):
public ObservableCollection<MyXmlObject> MyCollection { get; set; }
正如我在xaml中提到的,您只需将集合绑定到ItemsSource
<DataGrid ItemsSource="{Binding MyCollection}" .../>
现在只有正在更改的项目才会更新。