刷新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>

刷新WPF项目集合中的单个项目

我建议使用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}" .../>

现在只有正在更改的项目才会更新。