2011-08-25 4 views
0

Entity Framework는 ChangeTracker.State라는 속성이있는 추적 가능 엔터티를 제공합니다. 이것을 사용하여 엔티티가 삭제되었는지 식별 할 수 있습니다.WPF CollectionViewSource.Filter 성능 및 DataTrigger

목록에서 삭제 된 항목을 표시하고 싶지는 않습니다.

어느 것이 더 빠릅니까?

방법 1 : 녹음

<CollectionViewSource Filter="ViewSource_Filter" /> 

private void ViewSource_Filter(object sender, FilterEventArgs e) 
{ 
    var _Item = e.Item as ITrackableEntity; 
    e.Accepted = _Item.ChangeTracker.State != ObjectState.Deleted; 
} 

방법 2 테스트하고 제거하는 CollectionViewSource.Filter 사용 : 항목

<DataTemplate.Resources> 
    <Style TargetType="{x:Type DockPanel}"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding ChangeTracker.State}"> 
       <DataTrigger.Value> 
        <entities:ObjectState>Deleted</entities:ObjectState> 
       </DataTrigger.Value> 
       <Setter Property="Visibility" Value="Collapsed"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</DataTemplate.Resources> 
을 테스트하고 숨기기 위해 ItemTemplate.DataTemplate에 DataTrigger 추가를

감사합니다.

+0

거의 항상 : 측정해야하는 것이 빠르다는 것을 알아 내기. 옵션과 측정 값을 모두 만듭니다. 우리가 볼 수없는 의존성이 너무 많아서 이러한 유형의 질문에 확실한 답을 제공하는 것이 거의 불가능합니다. –

+0

예. 그렇지만 어떻게 XAML.DataTrigger의 실행을 측정합니까? 나는 진짜 측정이 거의 불가능할 것이라고 생각했기 때문에 일반적인 입장에서 더 많이 묻고 있었다. –

+0

전에 XAML 동작을 측정하려고 시도했을 때 "AllDone"이벤트가 없으면 정확하기위한 계획이 거의 완성되었습니다. –

답변

0

방법 1이 정답입니다.

0

하지만 Loaded 이벤트에 필요한 정보가있을 수 있습니다. MSDN에서 :로드 된 이벤트는 최종 렌더링 전에 발생하지만 레이아웃 시스템이 렌더링에 필요한 모든 값을 계산 한 후에 발생합니다. 로드 된 요소는 요소가 포함 된 논리 트리가 완료되었으며 HWND 및 렌더링 화면을 제공하는 프레젠테이션 소스에 연결됩니다. 내 해석은 필터와 트리거가 처리되었지만 나는 긍정적이지 않다는 것입니다. 언로드는 최종 번호가 아니지만 사과와 사과를 비교할 것이라고 생각합니다. 그러나 여전히 사과는 올바른 비교가 아닐 수도 있습니다. 디버거가 XAML을 걸었다면 아주 좋을 것입니다. 디버거는 XAML을 걷지 않기 때문에 트리거를 직접 측정 할 수 있다고 생각하지 않습니다. 가장 좋은 희망은 페이지를 측정하는 것입니다. 어려운 필터만으로 페이지를 만듭니다.

public MainWindow() 
    { 
     Debug.WriteLine(DateTime.Now.ToLongTimeString()); 
     InitializeComponent(); 
     Debug.WriteLine(DateTime.Now.ToLongTimeString()); 
    } 

    private void MainWindow_Loaded(object sender, RoutedEventArgs e) 
    { 
     Debug.WriteLine(DateTime.Now.ToLongTimeString()); 

디버그가 직선 실행과 같지 않아서 디버그가 3 번을 TextBlocks에 바인딩합니다. 또한 XAML에 정의 된 필터와 비교할 것입니다. 내 직감은 둘 다 너무 빨라서 차이를 알기가 어렵지만 필자는 필터가 빠름을 느낄 것입니다.

+0

하지만 : 최종 렌더링 전에 Loaded 이벤트가 발생했습니다! –

+0

정확히. 그러나 IF, 필터 및 트리거는 최종 렌더링 전에 처리되어 두 개를 비교하고 그 결과가 사용자의 질문입니다. 레이아웃 시스템이 렌더링에 필요한 모든 값을 계산 한 후에 어떻게 해석합니까? 필터와 트리거가 "필요한 모든 값을 계산했습니다"라는 좋은 기회. 미안해! – Paparazzi

2

이 문제와 관련된 ItemsControl이 있다고 가정 할 때 필자는 개인적으로 collectionview 기반 필터를 좋아합니다.

이유 ...

  1. 그것의 필터링 뷰 모델의 손에있다. 따라서 컬렉션보기를 새로 고침 할 때마다 다시 필터링됩니다.

  2. UI의 수명주기 동안 속성이 채워지고 업데이트되지 않는 경우 컬렉션 뷰는 렌더링시 한 번만 필터링합니다. 반면에 DataTriggers는 변경이 발생할 수도 있고 발생하지 않을 수도있는 ChangeTracker.State에 대한 변경 사항을 기다립니다.

  3. 대체 항목이 CollectionView가 적용된 ItemsControl의 행 스타일은 데이터 트리거에 올바른 영향을 미치지 않으며 항목을 숨기고 대체 행 스타일을 조정하지 않지만 collectionview는 항목을 미리 제외합니다 그 자체. 즉, 대체 행이 회색 배경 일 필요가있는 경우, DataTrigger가 사용되면 인접한 두 행이 회색이 될 수 있습니다.

  4. DataTriggers는 비 스크롤링 된 항목에만 적용되어 스크롤 막대 인공 지능이 실수로 표시 될 수 있습니다.스크롤보기에 표시되는 항목이 10 개만 표시되고 소스에 90 개의 항목이 있지만 50 개가 Deleted 상태 인 경우 스크롤하지 않으면 해당 데이터 트리거가 적용되지 않습니다. 따라서이 과정에서 스크롤바는 실제 스크롤 값을 조정하기 위해 다시 계산되고 깜박입니다. 그래서 스크롤 할 수있는 항목이 100 개있는 것 같지만 실제로 스크롤하려면 50 개의 항목 만 필요합니다.

CollectionView는 수동으로보기 전에 스크롤하는 데 50 개의 항목을 제공합니다.

성능면에서 정확하기 때문에 DataTrigger는 항목이 가상화되지 않은 경우 (즉 스크롤보기에서 가져온 경우)에만 적용된다는 사실 때문에 더 빠릅니다. 하지만 위와 같은 문제가 발생할 수 있습니다.

도움이 될지 알려주세요.