使用ItemsSource绑定的ComboBox会影响其他属性

时间:2011-10-12 12:24:58

标签: wpf binding combobox properties

我有一个组合框,显示可用系统颜色的列表。组合框中的每个项目都有一个预览矩形和文本颜色名称。在给定时间,我可能同时在屏幕上需要多达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 个答案:

答案 0 :(得分:1)

不要直接创建ListBoxItems,而是让框架完成。事实上,你可以在XAML中完成很多代码。

简化:

使用您创建的新课程创建ObservableCollection,可以调用它ColorInfo添加所有属性,例如名称,真实颜色。并用所有颜色填充此列表。 这可以根据需要重复使用。

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

ObservableCollection<ColorInfo> myColors;

现在,您将此列表设置为ItemsSource的{​​{1}}。最后,您提供了一个项目模板,每个条目应该如何。

ComboBox

当然,您可以提取模板并通过StaticResource引用它。

答案 1 :(得分:0)

如果那些ListViewItems是框架中的那些,那么你就不应该这样做。如果您有一个在控件之间共享的列表,它应该只包含数据,而不是UI元素。如果您需要以特定方式显示数据,请使用ItemTemplate和/或ItemContainerStyle

另请参阅:Styling and Templating

(只是设置ItemsSource不是一种绑定方式......)