当前位置: 首页 > 知识库问答 >
问题:

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

谢锦程
2023-03-14

[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的深入研究,我当然会扩展我在这方面的知识,但现在我只想让它发挥作用
这不是家庭作业

编辑:忘记列出我也会遇到的错误

系统.Windows。数据错误:4:无法找到引用“RelativeSource FindAncestor,AncestorType=”System.Windows.Controls的绑定源。ItemsControl',AncestorLevel=“1”
BindingExpression:Path=HorizontalContentAlignment;数据项=空;目标元素是“CategoryComboBoxItem”(名称=“”);目标属性是“HorizontalContentAlignment”(类型为“HorigintalAlignment)System.Windows。数据错误:4:无法找到引用“RelativeSource FindAncestor,AncestorType=”System.Windows.Controls的绑定源。ItemsControl',AncestorLevel=“1”
BindingExpression:Path=VerticalContentAlignment;数据项=空;目标元素是“CategoryComboBoxItem”(名称=“”);目标属性是“VerticalContentAlignment”(类型为“Vertical Alignment)System.Windows。数据错误:26:对于已经属于ItemsControl容器类型的项,忽略了ItemTemplate和ItemTemplateSelector;类型=“CategoryComboBoxItem”

共有1个答案

祝允晨
2023-03-14

要使用WPF正确地做到这一点,我认为您需要更好地了解DataContext及其工作原理。我写了一篇博客文章只是为了在SE上链接:你说的“DataContext”是什么?。我强烈建议您在使用WPF做任何事情之前确保您了解DataContext

您的总体想法是要将< code>ComboBox绑定到< code > category to 项的列表,并将< code>SelectedValue属性设置为< code>Name。

xml prettyprint-override"><!-- 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>

如果数据上下文设置正确,则可以使用绑定为 ComboBox 设置项

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

或者隐藏代码

MyComboBox.ItemsSource = CategoryList;

这也将同步您的< code >组合框。在列表中选择带有所选< code>CategoryDTO项目的edItem,这样您就可以直接对它进行强制转换以对其执行某些操作

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

或绑定它,以便从DataContext中轻松使用

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

注意:取决于<code>的数据类型。颜色属性,您可能需要使用Converter来转换。将值设置为SolidColorBrush。背景属性。网上应该有很多转换器的例子,或者问问你是否需要帮助。

 类似资料:
  • 我是C#新手,我不断收到以下无法删除的错误。 我的代码如下,我不能确切地说出哪一行导致了错误,但我怀疑它与RibbonRadioButtons有关,因为如果我删除它们,我不会得到错误。只有在单击两个或更多单选按钮后,错误才会出现。ComboBoxItem上的一个回答继续抛出绑定错误,尽管style暗示是多个Refresh()语句导致了这个问题,但我不知道如何避免这个问题。 有人能帮我解决这个问题吗

  • 我在后台有< code>ViewModel(实现< code > INotifyPropertyChanged )和类< code>Category,它只有一个< code>string类型的属性。我的ComboBox SelectedItem绑定到类别的实例。当我更改instance的值时,SelectedItem没有更新,Combobox也没有更改。 编辑:代码 组合框: 物业: 我尝试的是:

  • 我想在 WPF 中创建一个顶部有一个项的组合框,当它被选中时,选定项应设置为 null(重置为默认状态)。我一直在寻找,但没有找到令人满意的解决方案。 如果可能的话,我希望它只使用XAML代码或附加的行为来实现,因为我不太喜欢更改视图的ViewModel中的内容,或者重写标准控件。 这是我到目前为止想出的(缩短代码): 我认为最好的方法是以某种方式添加一个事件触发器,当项目被选中时,该触发器将设置

  • 我有一个用户控件,其数据上下文设置为名为 EmployeeList_VM 的视图模型。然后,我在该用户控件中有一个 ContentControl,该控件将其 datacontect 设置为视图模型的公共属性 (EmployeeSelection)。ContentControl 的数据上下文与同一用户控件中列表框的选定项绑定相同。 我希望ContentControl中的combobox(属于名为Em

  • 使用Datagridtemplatecolumn将WPFDatagrid绑定到组合框。很难获得组合框绑定的selectedItem。我发现了类似的例子,但这并不能解决我的问题。 请在下面找到我的 XAML 的代码片段和数据结构: 我在上面定义了一个数据结构,它实现了INotifyPropertychanged接口。 现在,在视图模型中,有一个可观察的X列表集合,即XList,它绑定到XAML中的数

  • 日安, 我希望我的组合框选择其中的第一个项目。我正在使用C#和WPF。我从DataSet读取数据。要填充组合框: 组合框XAML代码: 如果我尝试: 它不起作用。