2014-09-11 123 views
0

我有一個DataGrid,列中顯示的值並不總是正確更新。DataGrid項目不在ObservableCollection上更新

這裏的定義是:

<uic:DataGridControlEx Grid.Row="1" 
           ReadOnly="True" 
           Name="m_dgErgaenzungsfelder" 
           NavigationBehavior ="RowOnly" 
           SelectionMode="Extended" 
           AutoCreateColumns="False" 
           ItemsSource="{Binding Path=ErgaenzungsfelderEntities}" 
           SelectionChanged="OnDGSelectionChanged" > 

    <uic:DataGridControlEx.View> 
     <xc:TableView ColumnStretchMode="Last" 
            AllowColumnChooser="False" 
            VerticalGridLineThickness="0" 
            UseDefaultHeadersFooters="False" 
            ShowRowSelectorPane="False"> 
      <xc:TableView.FixedHeaders> 
       <DataTemplate> 
        <xc:ColumnManagerRow/> 
       </DataTemplate> 
      </xc:TableView.FixedHeaders> 
      <xc:TableView.Theme> 
       <xc:Office2007SilverTheme /> 
      </xc:TableView.Theme> 
     </xc:TableView> 
    </uic:DataGridControlEx.View> 

    <uic:DataGridControlEx.Columns> 
     <xc:Column Title="{LocText FGG1:ErgaenzungsfelderResources:ErgaenzungsfelderViewColumnName}" 
          FieldName="Name" /> 
     <xc:Column Title="{LocText FGG1:ErgaenzungsfelderResources:ErgaenzungsfelderViewColumnType}" 
          FieldName="ErgaenzungsfeldType" > 
      <xc:Column.CellContentTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding Path=., Converter={x:Static converters:ErgaenzungsfeldTypeTotextConverter.Instance}}" /> 
       </DataTemplate> 
      </xc:Column.CellContentTemplate> 
     </xc:Column> 
     <xc:Column Title="{LocText FGG1:ErgaenzungsfelderResources:ErgaenzungsfelderViewColumnAuthor}" 
          FieldName="Author" /> 
     <xc:Column Title="{LocText FGG1:ErgaenzungsfelderResources:ErgaenzungsfelderViewColumnCreationDate}" 
          FieldName="CreationDate" /> 
    </uic:DataGridControlEx.Columns> 

</uic:DataGridControlEx> 

DataGridControlEx exentds的Xceed DataGridControl但不影響綁定。

而且隨着ObservableCollection電網結合的定義後面的代碼,構造早期初始化的收集和更新項目的方法:

public ObservableCollection<ErgaenzungsfeldEntity> ErgaenzungsfelderEntities { get; private set; } 

public ErgaenzungsfelderView() { 
    ErgaenzungsfelderEntities = new ObservableCollection<ErgaenzungsfeldEntity>(); 
    InitializeComponent(); 
} 

public void ShowErgaenzungsfelder(List<ErgaenzungsfeldEntity> entities) { 
    ErgaenzungsfelderEntities.Clear(); 
    entities.ForEach(e => ErgaenzungsfelderEntities.Add(e)); 

    //m_dgErgaenzungsfelder.GetBindingExpression(ItemsControl.ItemsSourceProperty).UpdateSource(); 
} 

ErgaenzungsfeldEntity實現INotifyPropertyChanged並沒有通知的每一個變化屬性更改例如:

public string Name { 
    get { return m_name; } 
    set { 
     m_name = value; 
     NotifyPropertyChanged("Name"); 
    } 
} 

當通過GUI更新綁定項目時,所做的更改始終會被正確反映。通過GUI,項目不會使用上述ShowErgaenzungsfelder重新加載,但綁定項目將作爲參考傳遞。

期: 我們的服務層可以通知需要重新加載元素的事件。這將叫ShowErgaenzungsfelder。當這樣做時,添加的實體將出現在網格中,被刪除的實體將被刪除。但是,修改的實體不會反映字段Name和ErgaenzungsfeldType(這是唯一可以更改的屬性)的更改。
例如更改列排序將觸發更新網格並顯示正確的值。

對於`ItemsSource時,我試圖改變所有這些特性都沒有成功:

ItemsSource="{Binding Path=ErgaenzungsfelderEntities, UpdateSourceTrigger=Explicit, NotifyOnTargetUpdated=True, NotifyOnSourceUpdated=True, Mode=OneWay}" 

隨着

  • UpdateSourceTrigger =在ShowErgaenzungsfelder明確和取消註釋m_dgErgaenzungsfelder.GetBindingExpression(ItemsControl.ItemsSourceProperty).UpdateSource();
  • UpdateSourceTrigger =的PropertyChanged
  • UpdateSourceTrigger =默認

我很感激任何輸入。

+0

Does'nt「explicit」關鍵字告訴你自己更新你的數據源?你嘗試沒有屬性'UpdateSourceTrigger'? – 2014-09-11 08:02:00

+0

是的,那是我在PropertyChanged沒有觸發更新之後的最後一次嘗試,但它對'ItemsControl.ItemsSourceProperty'(這是正確的嗎?)不起作用 – Philippe 2014-09-11 08:04:05

回答

2

這裏有一些心理調試。

由服務層引發的事件不在GUI線程上運行,因此ShowErgaenzungsfelder函數也不在GUI線程上,也不是通過更改集合引發的事件。 WPF將在非GUI線程上接收這些事件,然後嘗試更新GUI,但會失敗,因爲它不會在GUI線程中拋出錯誤。 WPF在生成異常時的行爲是中止操作並隱藏異常,因此您什麼都看不到。 (在Visual Studio中,您可能會在「輸出」面板中看到這些例外情況;可以在此處顯示這些例外。)

要測試此操作,需要將更新發送到GUI線程。你可以這樣做:

public ObservableCollection<ErgaenzungsfeldEntity> ErgaenzungsfelderEntities { get; private set; } 

    public ErgaenzungsfelderView() { 
     ErgaenzungsfelderEntities = new ObservableCollection<ErgaenzungsfeldEntity>(); 
     InitializeComponent(); 

     // This will be called on the GUI thread 
     this.guiContext = SynchronizationContext.Current; 

    } 

    private readonly SynchronizationContext guiContext; 

    public void ShowErgaenzungsfelder(List<ErgaenzungsfeldEntity> entities) { 
     this.guiContext.Send(this.ShowErgaenzungsfelderOnGuiThread, entities); 
    } 
    private void ShowErgaenzungsfelderOnGuiThread(object state) { 
     List<ErgaenzungsfeldEntity> entities = state as List<ErgaenzungsfeldEntity>; 
     ErgaenzungsfelderEntities.Clear(); 
     entities.ForEach(e => ErgaenzungsfelderEntities.Add(e)); 
    } 
+0

Doh,我想提一下,但忘記了:/事件正在使用'CurrentDispatcher'在UI線程上分派。可能是一個很好的猜測,雖然 – Philippe 2014-09-11 09:15:11

+0

哦:) :)作爲腰帶和大括號的東西,你可以在ShowErgaenzungsfelderEntities方法中的NotifyPropertyChanged(「ErgaenzungsfelderEntities」),看看是否有幫助.. – 2014-09-11 09:19:44

+0

我現在已經實施'INotifyPropertyChanged'在ErgaenzungsfelderView '並且調用'OnPropertyChanged(「ErgaenzungsfelderEntities」);'在'ShowErgaenzungsfelder'結尾。 ItemsSource現在是'ItemsSource =「{綁定路徑= ErgaenzungsfelderEntities,UpdateSourceTrigger = PropertyChanged,NotifyOnTargetUpdated = True,NotifyOnSourceUpdated = True,Mode = OneWay}」'。不幸的是,行爲仍然是一樣的 – Philippe 2014-09-11 09:31:22

相關問題