2014-09-11 2 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이 Xceed DataGridControl을 exentds하지만 바인딩에 영향을주지 않습니다

다음은 정의입니다.

그리고 그리드가 결합하는 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을 사용하여 다시로드되지 않지만 바인딩 된 항목은 참조로 전달됩니다.

문제 : Google 서비스 레이어는 요소를 다시로드해야하는 이벤트를 알릴 수 있습니다. 전화는 ShowErgaenzungsfelder입니다. 이렇게하면 추가 된 항목이 그리드에 표시되고 제거 된 항목은 제거됩니다. 그러나 수정 된 엔티티는 Name 및 ErgaenzungsfeldType 필드 (변경 가능한 유일한 속성)에 대한 변경 사항을 반영하지 않습니다.
예. 열 정렬을 변경하면 눈금을 업데이트하고 올바른 값을 표시합니다.

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

명시하고 ShowErgaenzungsfelderm_dgErgaenzungsfelder.GetBindingExpression(ItemsControl.ItemsSourceProperty).UpdateSource();을 해제 주석

  • UpdateSourceTrigger =

  • UpdateSourceTrigger =하여 PropertyChanged 다음`ItemsSource, 내가 성공하지 않고 모든 속성을 변경하려고했습니다 들어

  • UpdateSourceTrigger = 기본값

모든 입력에 대해 감사드립니다.

+0

"explicit"키워드는 데이터 소스를 직접 업데이트하라는 메시지를 표시합니까? 당신은 'UpdateSourceTrigger' 속성없이 시도 했습니까? –

+0

예, PropertyChanged가 업데이트를 트리거하지 않았지만 마지막 시도 였지만'ItemsControl.ItemsSourceProperty'에 대해 작동하지 않았습니다. (올바른 것입니까?) – Philippe

답변

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

+0

오 잘 :) 벨트 및 괄호의 일로 ShowErgaenzungsfelderEntities 메서드에서 NotifyPropertyChanged ("ErgaenzungsfelderEntities")를 사용하면 도움이되는지 확인할 수 있습니다 .. –

+0

이제 'ErotfilterFelderView'에 'INotifyPropertyChanged'가 구현되었습니다. 'ShowErgaenzungsfelder'의 끝에서 OnPropertyChanged ("ErgaenzungsfelderEntities");를 호출합니다. ItemsSource는 이제'ItemsSource = "{바인딩 경로 = ErgaenzungsfelderEntities, UpdateSourceTrigger = PropertyChanged, NotifyOnTargetUpdated = True, NotifyOnSourceUpdated = True, Mode = OneWay}"'입니다. 불행히도 동작은 여전히 ​​동일합니다 – Philippe

관련 문제