WPF组合框项目背景绑定到项目属性

时间:2020-10-21 08:36:51

标签: c# wpf data-binding

如何获取将组合框项目的背景颜色绑定到模型的布尔值属性?

在搜索并尝试后,我可以找出答案,但是我不确定这是正确的方法。似乎long了

* 注意:在起草这个问题的过程中,我已经找到了以下解决方案

我有一个正在使用的简单代码示例:

我有一个Model和ViewModel,例如:

    public class YesNoModel
    {
        public string Name { get; set; }
        public bool Value { get; set; }
    }

    public class ViewModel
    {
        public IEnumerable<YesNoModel> YesNoItems { get; set; }

        public ViewModel()
        {
            var list = new List<YesNoModel>();

            list.Add(new YesNoModel() { Name = "Yes", Value = true });
            list.Add(new YesNoModel() { Name = "No", Value = false });

            YesNoItems = list;
        }
    }

一个将布尔值转换为颜色的值转换器

    public class BoolToBackgroundGrayConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if ((bool)value)
            {
                return Brushes.LightGray;
            }
            else
            {
                return Brushes.Transparent;
            }
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

XAML绑定到窗口中的组合框

    <Window.Resources>
        <local:BoolToBackgroundGrayConverter x:Key="BoolToBackgroundGrayConverter"/>
    </Window.Resources>
    <Window.DataContext>
        <local:ViewModel />
    </Window.DataContext>
    <Grid>
        <ComboBox ItemsSource="{Binding YesNoItems}">
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Name}" Background="{Binding Value, Converter={StaticResource BoolToBackgroundGrayConverter}}" />
                </DataTemplate>
            </ComboBox.ItemTemplate>            
        </ComboBox>
    </Grid>

这是正确的方法吗?在Value Converter中对颜色进行硬编码似乎有些漫长,同时也感觉有些错误

1 个答案:

答案 0 :(得分:0)

没有绑定转换器的替代方法可以是DataTrigger:

<ComboBox.ItemTemplate>
    <DataTemplate>
        <TextBlock Text="{Binding Name}">
            <TextBlock.Style>
                <Style TargetType="TextBlock">
                    <Setter Property="Background" Value="Transparent"/>
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Value}" Value="True">
                            <Setter Property="Background" Value="LightGray"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Style>
        </TextBlock>
    </DataTemplate>
</ComboBox.ItemTemplate>