2016-10-31 2 views
0

엔티티 프레임 워크를 사용하여 데이터베이스를 쿼리하고 결과를 ICollectionView에 배치하는 방법이 있습니다. ICollectionViewDataGrid에 대해 ItemsSource의 역할을합니다. 첫 번째 쿼리에서는 모든 것이 제대로 작동하지만 두 번째 쿼리에서 올바른 SortDescriptions의 적용에도 불구하고 데이터가 올바르게 정렬되지 않습니다.소스를 변경 한 후 ICollectionView 정렬이 작동하지 않습니다.

다음은 데이터를/쿼리 및 그룹화를 시도 정렬 내 코드입니다 :

CollectionViewSource cvsRS; 

    private ObservableCollection<productorder> rs; 
    public ObservableCollection<productorder> RS 
    { 
     get { return rs; } 
     set 
     { 
      if (rs != value) 
      { 
       rs = value; 
       OnPropertyChanged("RS"); 
      } 
     } 
    } 

    private ICollectionView rsView; 
    public ICollectionView RSView 
    { 
     get { return rsView; } 
     set 
     { 
      if (rsView != value) 
      { 
       rsView = value; 
       OnPropertyChanged("RSView"); 
      } 
     } 
    } 

    public void QueryDatabase() 
    { 

     RS = new ObservableCollection<productorder>(DatabaseEntities.productorders.Where(o => o.month.id == CurrentMonth.id)); 
     if (RS != null) 
     { 
      cvsRS.Source = RS; 
      RSView = cvsRS.View; 

      RSView.GroupDescriptions.Clear(); 
      RSView.GroupDescriptions.Add(new PropertyGroupDescription("producttype.productcategory.name")); 
      RSView.GroupDescriptions.Add(new PropertyGroupDescription("producttype.name")); 

      RSView.SortDescriptions.Clear(); 
      RSView.SortDescriptions.Add(new SortDescription("producttype.productcategory.sortorder", ListSortDirection.Ascending)); 
      RSView.SortDescriptions.Add(new SortDescription("client.name", ListSortDirection.Ascending)); 
      RSView.Refresh(); 
      CurrentRecord = null; 
      SelectedRecords = null; 
     } 
    } 

그룹화가 잘 작동하지만 그룹은 분류에 따라 올바른 순서에 있지 않습니다. 가능한 많은 수의 "수정 사항"을 시도했습니다 (예 : CollectionViewSource에 직접 정렬/그룹 설명 추가, 그룹화 전에 정렬, 정렬/그룹화 중 일부 제거, SortDescriptions/CollectionViewSource does not re-sort on property change 제외).

아무도 수행되는 쿼리 수에 관계없이 정렬 순서를 유지하는 방법을 알고 있습니까? 나는 그것이 작동할지 모른다면 DataGrid에 데이터를 표시하는 질의의 다른 방법에 대해 공개적이다.

+0

'ObservableCollection '속성에 새 컬렉션을 제공 할 때 'PropertyChanged'를 발생시키는 Source (바인딩, 바인딩, Binding 클래스의 인스턴스 사용)를 한 번 바인딩하려고합니다. 그런 다음 속성을 변경하여 다시 채 웁니다. 새 컬렉션을 던지거나 이전 컬렉션을 지우고 다시 채 웁니다. 그러나 처음에는'Binding'을 설정하는 것을 제외하고'cvsRS.Source'를 만지지 마십시오. –

+0

잘하면이 구문을 올바르게 해석했다. 나는 이것을 생성자에서 수행했다.'cvsRS = new CollectionViewSource(); cvsRS.Source = 새 바인딩 ("RS"); RSView = cvsRS.View; 하지만 'System.Windows.Data.Binding'속성 'Source'의 값이 올바르지 않습니다. –

+0

빠른 테스트를 수행하여 예상 한대로 작동하므로 바인딩을 수행하는 방법의 예를 들어 답글을 게시했습니다. 코멘트에 그것을 붙여 넣는 것은 어쨌든 읽을 수 없을 것입니다. –

답변

1

CollectionViewSource.Source 속성을 ObservableCollection<T> 속성에 바인딩 해보세요. viewmodel 생성자에서 바인딩을 설정하십시오. 그럼, 그냥 내버려둬. ObservableCollection<T>을 업데이트하고 바꿉니다. ObservableCollection<T>이고 공용 속성을 사용하면 대체 할 때마다 PropertyChanged이 발생합니다.

public MyViewModel() 
{ 
    BindCollectionViewSource(); 
} 

protected void BindCollectionViewSource() 
{ 
    cvsRS = new CollectionViewSource(); 

    var binding = new Binding 
    { 
     Source = this, 
     Path = new PropertyPath("RS") 
    }; 
    BindingOperations.SetBinding(cvsRS, CollectionViewSource.SourceProperty, binding); 
} 

// Since we're not going to be messing with cvsRS or cvsRS.View after the 
// constructor finishes, RSView can just be a plain getter. The value it returns 
// will never change. 
public ICollectionView RSView 
{ 
    get { return cvsRS.View; } 
} 

Source에 바인딩을 할당 할 수는 없습니다. 그것보다 더 많은 것이 있습니다. XAML에 표시되는 Source="{Binding RSView}" 항목은 할당처럼 보일 수 있지만 편의를 위해 일부 내용이 숨겨져 있습니다. Binding은 적극적으로 도움이됩니다. 목표물이 누구인지 알아야합니다.

하나의 재미있는 것을 보았습니다. 내 테스트 코드는 PropertyGroupDescription이고 하나는 SortDescription입니다. 컬렉션에 항목을 추가하면 그룹 내에서 항목이 정렬됩니다. 그런 다음 RSView.Refresh()를 호출했을 때, 그룹에 대한 참조없이 그것들을 의지했습니다. 내가 그곳에서 무엇을하고 있는지 이해하지 못했습니다.

+0

감사합니다. 위의 코드를 구현했지만,'DataGrid'는 어떤 데이터도 보여주지 않습니다. 그것의'ItemsSource'는'RSView'에 묶여 있습니다. 나는 또한'QueryDatabase' 메소드를 동일하게 유지했다. 예외는'cvsRS.Source = RS; RSView = cvsRS.View; –

+0

이제는 새로운 컬렉션을 만드는 대신 RS.Clear()를 추가하고 항목을 추가하십시오. –

+0

그게 효과가 있어요. 감사! –

관련 문제