刷新WPF ItemCollection中的单个项目

时间:2014-10-01 21:57:12

标签: c# wpf datagrid

我有一个绑定到某些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>

1 个答案:

答案 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}" .../>

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