ComboBox с использованием привязки ItemsSource влияет на другие свойства - PullRequest
1 голос
/ 12 октября 2011

У меня есть поле со списком, который отображает список доступных системных цветов. Каждый элемент в поле со списком имеет прямоугольник предварительного просмотра и название цвета текста. В определенный момент времени мне может понадобиться до 6 таких комбинированных списков на экране одновременно. Я создал статический список элементов для повторного использования во всех полях со списком, чтобы уменьшить накладные расходы. Это работает и работает быстро, но теперь, когда я изменяю другие свойства поля со списком, такие как установка веса шрифта жирным шрифтом, это влияет на все поля со списком, а не только на тот, к которому я применил свойство.

Вот мой код, все сделано в коде позади.

Объявление списка, который я использую, и поле со списком:

    static private List<ListViewItem> _colorItems = null;
    ComboBox _comboBoxColorList;

Затем в конструкторе для моего элемента управления, который содержит поле со списком, у меня есть код для первоначального создания списка:

        if (_colorItems == null)
        {
            _colorItems = new List<ListViewItem>();

            PropertyInfo[] colorProperties = typeof(Colors).GetProperties(BindingFlags.Static | BindingFlags.Public);
            Dictionary<String, Color> colorDictionary = colorProperties.ToDictionary(p => p.Name, p => (Color)p.GetValue(null, null));
            ListViewItem newItem;
            foreach (KeyValuePair<String, Color> keyPair in colorDictionary)
            {
                newItem = CreateListViewItem(keyPair.Key, keyPair.Value);
                _colorItems.Add(newItem);
            }
        }

Затем я создаю поле со списком:

        _comboBoxColorList = new ComboBox();
        _comboBoxColorList.Height = Constants.ListViewPropertyComboBoxHeight;
        _comboBoxColorList.VerticalContentAlignment = VerticalAlignment.Center;
        _comboBoxColorList.Background = Brushes.White;
        _comboBoxColorList.ItemsSource = _colorItems;
        _comboBoxColorList.SelectionChanged += new SelectionChangedEventHandler(comboBoxColorList_SelectionChanged);
        Children.Add(_comboBoxColorList);

Затем, позже, в обработчике событий у меня есть этот код, чтобы установить поле со списком жирным шрифтом:

            _comboBoxColorList.FontWeight = FontWeights.Bold;

Если я сделаю так, чтобы _colorItems не был статичным, все ведет себя как следует, но это медленно. Когда _colorItems статичен, он очень быстрый, но строка выше заставляет все поля со списком выделять полужирный источник элемента.

Любое понимание или мудрость были бы велики.

Ответы [ 2 ]

1 голос
/ 12 октября 2011

Вместо того, чтобы создавать ListBoxItems напрямую, пусть это будет сделано платформой. Фактически, вы делаете много кода, который может и должен быть выполнен в XAML.

Для простоты:

Создайте ObservableCollection с новым классом, который вы создаете, назовите его, возможно, ColorInfo, добавьте все ваши свойства, такие как имя, настоящий цвет И заполните этот список всеми своими цветами. Это может использоваться повторно так часто, как вы хотите.

class ColorInfo
{
    public Color Color{get;set;}
    public string Name{get;set;}
}

ObservableCollection<ColorInfo> myColors;

Теперь вы установите этот Список как ItemsSource вашего ComboBox. И, наконец, вы предоставляете шаблон элемента, как должна выглядеть каждая запись.

<ComboBox x:Name="_comboBoxColorList">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <DockPanel>
            <Rectangle DockPanel.Dock="Left" Width="16" Height="16">
                <Rectangle.Fill>
                    <SolidColorBrush Color="{Binding Color}"/>
                </Rectangle.Fill>
            </Rectangle>
                <TextBlock Fill="{Binding Name}"/>
            </DockPanel>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

Конечно, вы можете извлечь шаблон и сослаться на него через StaticResource.

0 голосов
/ 12 октября 2011

Если это ListViewItems те из фреймворка, вы не должны этого делать.Если у вас есть список, который разделяется между элементами управления, он должен содержать только данные, а не элементы пользовательского интерфейса.Если вам нужно, чтобы данные отображались определенным образом, используйте ItemTemplate и / или ItemContainerStyle.

См. Также: Стили и шаблоны

(Кстати, простая установка ItemsSource не является обязательной ...)

...