문제

나는있다 ObservableCollection WPF에 앉아있는 뷰 모델 DataGrid. 그만큼 DataGrid 세 가지 열이 있습니다.

  • 위치 열; 이것은 내 Datagrid의 행 위치를 표시하는 USERCONTROL에 의해 런타임에 렌더링됩니다.
  • 이름 열; 이것은 열의 이름을 표시하는 USERCONTROL에 의해 런타임에 렌더링됩니다 (예, 이름이 표시되는 방법에 따라 USERCONTROL이 필요하지만 제쳐두고 있습니다).
  • 데이터 열; 이것은 또 다른 usercontrol에 의해 런타임에 렌더링됩니다.

내 열은 다음과 같이 정의됩니다.

        <toolkit:DataGrid.Columns>
            <toolkit:DataGridTemplateColumn Header="" MinWidth="35" MaxWidth="35" SortMemberPath="Position.PositionIndex" CanUserSort="True">
                <toolkit:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ContentPresenter Content="{Binding Path=Position}"/>
                    </DataTemplate>
                </toolkit:DataGridTemplateColumn.CellTemplate>
            </toolkit:DataGridTemplateColumn>
            <toolkit:DataGridTemplateColumn Header="Name" MinWidth="150" Width="150" SortMemberPath="Name" CanUserSort="True">
                <toolkit:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ContentPresenter Content="{Binding Path=Name}"/>
                    </DataTemplate>
                </toolkit:DataGridTemplateColumn.CellTemplate>
            </toolkit:DataGridTemplateColumn>
            <toolkit:DataGridTemplateColumn Header="Data" Width="Auto" CanUserSort="False">
                <toolkit:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ContentPresenter Content="{Binding Path=Data}"/>
                    </DataTemplate>
                </toolkit:DataGridTemplateColumn.CellTemplate>
            </toolkit:DataGridTemplateColumn>
        </toolkit:DataGrid.Columns>

그래서 내 행과 이름 열은 usercontrols이기 때문에 WPF DataGrid 기본적으로 분류 할 수 없습니다. 열 헤더를 클릭하면 정렬을 용이하게하기 위해 ListCollectionView.CustomSort 마법.

다음은 이름 열의 사용자 정의 분류기가 모양입니다.

// Customized sorter, by name, ascending.
public class AscendingNameSorter : IComparer
{
    public int Compare(object x, object y)
    {
        var lhs = (MyViewModel)x;
        var rhs = (MyViewModel)y;

        return lhs.Name.CompareTo(rhs.Name);
    }
}

// Customized sorter, by name, descending.
public class DescendingNameSorter : IComparer
{
    public int Compare(object x, object y)
    {
        var lhs = (MyViewModel)x;
        var rhs = (MyViewModel)y;

        return rhs.Name.CompareTo(lhs.Name);
    }
}

문제는 이것이 사실입니다 엄청나게 느립니다. 왜 그런지 알 수 없습니다. 10 개의 항목이 있습니다 DataGrid, 내 응용 프로그램은 리조트가있는 동안 3-4 초 동안 중단됩니다. 나는 생각했다 ListCollectionView.CustomSort 정렬하는 가장 효율적인 방법이어야했습니다. ObservableCollection... 내가 어디로 잘못 가고 있습니까?

도움이 되었습니까?

해결책

WPF는 정렬이 변경 될 때마다 모든 USERCONTROL을 재현하고 있으므로 제 컨트롤을 구성 할 때 무언가가 느린 것입니다. 그러나 그것은 단지 추측 일뿐입니다.

문제를 좁히는 것으로 시작해야합니다. 다음은 수행 할 수있는 몇 가지 단계입니다.

  1. 3-4 초가 소요되는 작업을 찾으십시오. 지연이 Customsort에 값을 할당 할 때만 발생하는지 또는 Customsort가 설정된 후 목록이 변경 될 때마다 발생하는지 확인하지 않았습니다. 이것은 차이를 만듭니다.

  2. 내장형 정렬을 사용하여 일반 텍스트 열을 추가하고 정렬하여 빠른지 여부를 확인하십시오. 아마도 당신은 이미 이것을했지만, 당신은 당신의 질문에서 말하지 않았습니다.

  3. 진단 목적으로 일시적으로 세관 설정 설정을 중지하고 ListCollectionView.Filter를 설정하십시오. 항상 사실을 반환하는 필터로 설정하십시오. 여전히 속도가 느려지면 문제는 ListCollectionView의 항목을 재구성하려는 시도와 관련이 있습니다.

  4. 템플릿을 일시적으로 편집하고 사용자 정의 USERControls를 사소한 것으로 바꾸십시오 (예 : <CheckBox/>) 상황이 상승하는지 아닌지 확인합니다.

  5. USERCONTROLS 생성자에 중단 점을 설정하여 예상 횟수라고 불리는지 확인하십시오 (예 : 목록에 10 개의 항목이있는 경우 10 개의 생성자 호출). 그들이 예상보다 더 많은 시간이라고 부르면 스택 추적을보고 추가 통화가 어디에서 왔는지 확인하십시오.

  6. Usercontrol 생성자에 코드를 추가하여 DateTime을 작성하고 생성자가 출력 창 (또는 로그 또는 무엇이든)로 호출되었습니다. 이것은 당신에게 각각의 시간이 얼마나 걸리는지에 대한 아이디어를 줄 것입니다.

  7. 관찰에 수집 된 수백 개의 항목을 vs.net을 사용하여 앱을 나란히 실행하고 정렬 버튼 (또는 무엇이든)을 클릭 한 다음 vs.net의 모든 버튼을 누르고 스택 추적을보십시오. 계속해서 히트를하고 즉시 휴식을 다시 한 다음 스택 추적을 다시 봅니다. 여러 번 반복하십시오. 이것은 당신에게 모든 시간이 더 걸리는지에 대한 좋은 아이디어를 줄 것입니다.

내가 의심되는 바와 같이, 문제가 느리면 Usercontrols 생성 및 바인딩이 느리면 다음과 같이 찾을 수 있습니다. 문제는 모든 목록 변경에서 발생하며 필터를 변경할 때 발생하면 UserControls를 교체 할 때 속도가 빨라집니다. <CheckBox/>, 당신의 생성자는 항목 당 한 번만 호출되며, 통화 사이의 시간은 대단합니다.

내가 말하는 것이 아닙니다 건설자 느린 USERCONTROL 중 USERCONTROL은 데이터가 바운드 일 때 많은 하위 객체를 인스턴스화하거나 느리거나 복잡한 객체를 포함하거나 파일을로드하거나 기타 가능한 많은 원인을 포함 할 수 있습니다. 결론은 객체의 데이터 템플릿을 인스턴스화하고 시각적 트리에 추가하는 것이 느리게 일한다는 것입니다. 스택 트레이스는 어디서 볼 수 있는지 아이디어를 제공해야합니다.

그것이 다른 것으로 판명되거나 당신이 그것을 알아낼 수 없다면, 위의 테스트가 공개 한 내용에 대한 자세한 정보를 제공하기 위해 질문을 업데이트하면 도움을 줄 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top