我有一个绑定到某些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>
答案 0 :(得分:1)
我建议使用ObservableCollection作为ItemSource,ObservableCollection中的条目必须实现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或代码隐藏):
public ObservableCollection<MyXmlObject> MyCollection { get; set; }
正如我在你的xaml中所提到的,你只需将集合绑定到ItemsSource
即可<DataGrid ItemsSource="{Binding MyCollection}" .../>
现在只有更改的项目才会更新。