Неочаквано поведение на AlternativeRow BackColor в WPF

Оформям своя DataGrid, като използвам стил, предоставен от Microsoft на тази страница. Не променям този стил, освен един ред, както следва, който позволява алтернативен цвят на задния ред.

<!--Style and template for the DataGrid.-->
    <Style TargetType="{x:Type DataGrid}">
        <Setter Property="AlternationCount" Value="2"/>
 ... and the rest of the style

Разбрах много странно поведение на този стил. Когато превъртите нагоре/надолу мрежата с данни няколко пъти и след това видите, че алтернативният цвят на задния ред е смесен! като следното изображение:

смесен алтернативен цвят на гърба

Очаквам последователност от светло оцветени + тъмно оцветени редове, което е вярно преди превъртане; но след превъртане всичко се разбърква на случаен принцип. Преди да приложа този стил, изрично задавах алтернативен цвят на реда в DataGrid дефиниция, като следното, което никога не съм срещал подобно поведение.

<DataGrid ItemsSource="{Binding Source={StaticResource itemsSource}}" AutoGenerateColumns="False" AlternatingRowBackground="#FF58C9FD" RowBackground="#00000000"/> 

Някой има ли предложение къде да търся проблема?


person Hamed    schedule 16.05.2015    source източник


Отговори (2)


Това е известен проблем с виртуализацията на WPF DataGrid.

Ето заобиколно решение, но имайте предвид, че може да причини сериозни проблеми с производителността, ако работите с големи количества данни в тази DataGrid .

Има добро обяснение на механиката зад това поведение тук.

person Gabriel Rainha    schedule 16.05.2015
comment
Да, всъщност отметнах тази опция, но наказанието за производителност е доста сериозно и неприемливо в моята ситуация. Въпреки това, както споменах, този проблем възниква само при използване на стил, в противен случай задаването на свойства директно в дефиницията на datagrid не би предизвикало такива проблеми. - person Hamed; 16.05.2015
comment
Случайно да използвате някакъв скрит стил за DataGrid във вашия проект? Защото, ако го направите, опитайте да добавите BasedOn={StaticResource {x:Type DataGrid}} към този стил, така че да не замени настройките, които сте направили, които може да са го накарали да работи без вашия персонализиран стил. - person Gabriel Rainha; 16.05.2015
comment
Когато използвам стил на Microsoft или когато дефинирам свойства изрично в дефиницията на datagrid? - person Hamed; 16.05.2015
comment
Разбрах, но за съжаление, когато работи добре, няма стил :) само изрично присвояване на свойства. - person Hamed; 16.05.2015

Габриел спомена, че това поведение е известен проблем, който възниква, когато се опитате да създадете чисто нов стил за мрежа с данни (или като цяло всяка колекция от елементи).

Опитах се да създам стил въз основа на стила по подразбиране, както беше предложено от Габриел, като следното:

<Style TargetType="{x:Type DataGrid}" BasedOn="{StaticResource {x:Type DataGrid}}">
        <Setter Property="AlternationCount" Value="2"/>
        <Setter Property="AlternatingRowBackground" Value="OrangeRed"/>
 </Style>

Опитах се да заменя всички свойства, от които се нуждая, чрез този стил и работи добре. Може би липсва трик/ощипване в стиловете, предоставени от MSDN (който се дублира в повечето стилове, намерени в мрежата), който коригира този проблем. Все още сме благодарни, ако някой ни актуализира.

Междувременно предлагам да замените стиловете по подразбиране чрез вашата персонализация и да избягвате всякакви чисто нови стилове.

person Hamed    schedule 16.05.2015