Показаны сообщения с ярлыком C#. Показать все сообщения
Показаны сообщения с ярлыком C#. Показать все сообщения

вторник, 23 июня 2009 г.

DataGrid. Неверное отображение привязанных элементов после прокрутки.

Предусловия:
WPF, DataGrid, Binding.
Вы используете DataGrid, ячейки таблицы меняют свои состояния динамически, и привязаны к неким свойствам посредством Binding.
Симптомы:
При скролировании строк DataGrid'а, состояния некоторых свойств отображаются неверно.
Решение:

Чтобы решить проблему достаточно переключить свойство VirtualizingStackPanel.VirtualizationMode на значение "Standard".
Что при этом происходит?
VirtualizingStackPanel используется, как видно из названия, для виртуализации объектов, в нашем случае, DataGrid. Т.е. когда вы смещаете видимую область таблицы, строки, которые не отображаются виртуализируются с целью экономии. Но и тут есть особенности - одно дело виртуализировать объект, другое - его состояния.
Значение свойства "Standard" отключает виртуализацию. Это приводит к тому, что все объекты таблицы хранятся в памяти целиком. Минусы: память расходуется не оптимально, плюсы: не требуется восстанавливать и виртуализировать объекты, и как следствие - работа с объектами происходит быстрее.

Listing...
DataGrid
Style="{StaticResource DataGridStyle}"
MaxWidth="500"
MaxHeight="500"
SelectionMode="Single"
SelectionUnit="FullRow"
Loaded="MainGrid_Loaded"
VirtualizingStackPanel.VirtualizationMode="Standard"
Читать дальше......

четверг, 18 июня 2009 г.

WPF. Создание UserControl со свойством типа коллекция. Некорректная работа XamlReader при восстановлении такого объекта.

Предусловия:
Вы создали свой контрол. В своём контроле создали своё DependencyProperty с объектом коллекции, например ObservableCollection<>:

Listing 1:

public static readonly DependencyProperty ElementPortsProperty = DependencyProperty.Register("CollectedProperty",
typeof(ObservableCollection<>), typeof(MyClass), new FrameworkPropertyMetadata(new ObservableCollection<>());

Проблема:
Возможна следующая ситуация когда вы восстанавливаете такой объект при помощи XamlReader: свойство-коллекция элемента содержит дублированные
элементы
.


Пояснение:
Если в контроле есть custom свойство-коллекция, которое заполнено в XAML-файле вашего контрола то в момент дессериализации будет происходить следующее:

Восстановится ваш контрол целиком (с заполненным по-умолчанию свойством-коллекцией), затем в Xaml-файле обнаружится коллекция с объектами и эти объекты добавятся в восстановленный Custom Control.

Как с этим бороться? Два очевидных способа:
1. Не заполнять в Конструкторе коллекцию, а инициализировать её заполнение из .cs-файла когда это нужно.
2. В элементы коллекции добавить уникальный ключ, который позволит проверять наличие этого элемента в коллекции.

Примеры:
Binary of uncorrect working DP
Binary of correct working DP
Sources of correct working DP

Читать дальше......