WPF数据绑定组合框中的彩色项目

时间:2016-03-22 14:47:37

标签: c# wpf data-binding combobox code-behind

我已阅读其他几篇文章,但没有一篇能够回答我的问题组合
我有一个ComboBox,我想在其中显示不同颜色的项目,这可以通过使用ComboBoxItem并设置其背景来完成。当我想以不同的颜色存储我的CategoryDTO并稍后能够再次提取它时,我的问题出现了。我需要显示的只是我的CategoryDTOs的颜色和Name属性。然后我必须能够从SelectedItem属性中获取CategoryDTO对象。我使用ItemsSource,DisplayMemberPath和SelectedValuePath尝试了各种解决方案。但是只完成了这个Picture of the combobox 如图所示它显示颜色,但只显示所选CategoryDTO的名称,我甚至还没有测试过SelectedItem是否正常工作。 下面我将把我使用的代码。

[Serializable]
public class CategoryDTO
{
    public string Name { get; set; }
    ...not important...
}


CategoryDTO[] categories = await _isd.GetCategoriesAsync();
comboBoxCategory.ItemsSource = categories.Select(c => new CategoryComboBoxItem(c)).ToList();
comboBoxCategory.DisplayMemberPath = "Name";
comboBoxCategory.SelectedValuePath = "Name";

public class CategoryComboBoxItem : ComboBoxItem
{
    public CategoryComboBoxItem(CategoryDTO category)
    {
        this.Background = new SolidColorBrush(category.Color);
        this.Content = category;
    }
}

我没有在.xaml中指定任何特殊内容,所以我会把那部分留下来。除此之外,我希望能够使用Name属性设置SelectedItem。我非常希望答案是代码隐藏的,但如果它是愚蠢的复杂.xaml只有答案也一样好。我对MVVM没有任何经验,我可以假设它会被建议。当我深入研究WPF时,我当然会扩展我对这个问题的了解,但是现在我只是想让它工作。
这不是作业

编辑:忘记列出错误我也

  

System.Windows.Data错误:4:找不到用于引用的绑定源' RelativeSource FindAncestor,AncestorType =' System.Windows.Controls.ItemsControl',AncestorLevel =' 1& #39;&#39 ;.
  BindingExpression:路径= Horizo​​ntalContentAlignment;的DataItem = NULL; target元素是' CategoryComboBoxItem' (名称='&#39); target属性是' Horizo​​ntalContentAlignment' (键入' Horizo​​ntalAlignment')   System.Windows.Data错误:4:无法找到与引用绑定的源' RelativeSource FindAncestor,AncestorType =' System.Windows.Controls.ItemsControl',AncestorLevel =' 1' &#39 ;.
  BindingExpression:路径= VerticalContentAlignment;的DataItem = NULL; target元素是' CategoryComboBoxItem' (名称='&#39); target属性是' VerticalContentAlignment' (键入' VerticalAlignment')   System.Windows.Data错误:26:对于ItemsControl的容器类型的项目,将忽略ItemTemplate和ItemTemplateSelector;类型=' CategoryComboBoxItem'

1 个答案:

答案 0 :(得分:2)

要使用WPF正确执行此操作,我认为您需要更好地了解DataContext及其工作原理。我写了一篇博文,只是为了链接SE:What is this "DataContext" you speak of?。我强烈建议您在使用WPF做任何事情之前确保理解DataContext

您的总体想法是要将ComboBox绑定到CategoryDTO项列表,并将SelectedValue属性设置为Name

<!-- create a ComboBox -->
<ComboBox x:Name="MyComboBox" SelectedValuePath="Name">
    <!-- Add a custom Style to the individual items in combobox -->
    <ComboBox.ItemContainerStyle>
        <!-- In custom style, bind background color -->
        <Style TargetType="{x:Type ComboBoxItem}">
           <Setter Property="Background" Value="{Binding Color}"/>
        </Style>
    </ComboBox.ItemContainerStyle>
</ComboBox>

如果正确设置了DataContext,则可以使用绑定为ComboBox设置项目

<ComboBox ItemsSource="{Binding CategoryList}" ..>

或使用代码

MyComboBox.ItemsSource = CategoryList;

这也会使您的ComboBox.SelectedItem与列表中所选的CategoryDTO项同步,这样您就可以直接将其投放到其中进行操作

CategoryDTO selected = (CategoryDTO)MyComboBox.SelectedItem;
DoSomethingWithSelected(selected);

或绑定它,以便从DataContext

中轻松使用
<ComboBox SelectedItem="{Binding SelectedCategory}" ..>
// Can now use SelectedCategory directly
DoSomethingWithSelected(SelectedCategory);

注意:根据.Color媒体资源的数据类型,您可能需要使用Converter.Color值转换为SolidColorBrush .Background 1}}属性。应该有很多在线转换器的例子,或者只是询问你是否需要帮助。