2014-10-01 35 views
0

我有一個綁定到某些XML數據的DataGrid。刷新WPF中的單個項目CollectionCollection

當我在XML數據中進行更改時,DataGrid不刷新以反映這些更改。

解決此問題的「簡單」方法是在每次進行更改時調用MyDataGrid.Items.Refresh()。

但是,這是laggy,似乎相當低效。

我該如何刷新一個單個的行,而不是整個數據網格?我可以輕鬆訪問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

您可以從源集合中移除已更改的XmlElement,然後將其重新插入到相同的位置嗎?它可以工作.. – 2014-10-01 22:04:23

+0

也許首先向我們展示讀取XML並填充數據網格的代碼。另外,對應用程序外部的XML(文件)進行了更改?如果是這樣,也許你可以掛接一個filesystemwatcher來觀看你的xml文件,並相應地更新你的數據網格。 – failedprogramming 2014-10-01 22:04:38

+0

@ h.alex:好的想法。我得到了一個錯誤:「雖然ItemsSource正在使用時操作無效,但使用ItemsControl.ItemsSource訪問和修改元素」。和失敗的編程:我用一些代碼更新了原文。這些更改在應用程序內。 – Brent 2014-10-01 22:22:11

回答

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)); 
     } 
    } 
} 

您的用戶控件(視圖模型,控制器或後面的代碼)代碼:

public ObservableCollection<MyXmlObject> MyCollection { get; set; } 

正如我在XAML中提到你只需將集合綁定到ItemsSource

<DataGrid ItemsSource="{Binding MyCollection}" .../> 

現在只有beeing變更的項目纔會更新。

+0

我可能錯過了一些明顯的東西,但是當我將DataGrid的ItemSource從{綁定}更改爲{綁定MyCollection}時,所有項目都消失了。 – Brent 2014-10-08 02:25:01

+0

它取決於你的UserControls的DataContext。您必須將集合放到代表UserControls DataContext的類中。例如,如果它是您的UserControl本身的代碼嘗試設置__DataContext = this; __ – coder0815 2014-10-08 06:15:52

+0

我不確定這是否會工作,因爲我已經將XAML中的DataContext設置爲「{Binding ElementName = ObjectPanelListBox,路徑=的SelectedItem}」 – Brent 2014-10-08 17:18:58