ComboBox绑定仅使用Color属性的一种方式

时间:2015-05-27 15:35:33

标签: wpf binding combobox

我正在实施ObservableCollection< - > DataGrid绑定。 我的课程由System.Windows.Media.Color字段(名为' Color')和几个字符串组成。

我在Color列的WPF中的实现:

<DataGridTemplateColumn Header="Color" Width="100">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ComboBox ItemsSource="{Binding Source={StaticResource ColorProperties}}" 
                      SelectedItem="{Binding Path=Color, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" 
                      Style="{StaticResource ComboBoxFlatStyle}">
                <ComboBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Margin="1" Orientation="Horizontal">
                            <Rectangle Fill="{Binding}" Height="10" Width="10" Margin="2"/>
                            <TextBlock Text="{Binding}" Margin="2,0,0,0"/>
                        </StackPanel>
                    </DataTemplate>
                </ComboBox.ItemTemplate>
            </ComboBox>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

和ColorProperties:

<ObjectDataProvider x:Key="ColorProperties" ObjectType="{x:Type color:ColorHelper}" 
                    MethodName="GetColorNames"/>

ColorHelper课程(我试图找到OP作为学分):

public static class ColorHelper
{
    public static IEnumerable<string> GetColorNames()
    {
        foreach (PropertyInfo p
          in typeof(Colors).GetProperties(
          BindingFlags.Public | BindingFlags.Static))
        {
            yield return p.Name;
        }
    }
}

这很好用,我可以看到所有颜色的组合框:

enter image description here

现在我向ObservableCollection添加了一些对象,并在DataGrid中填充了它们各自的字段。除了颜色以外的所有。

默认颜色为黑色,但是当我运行应用程序时,ComboBox保持为空。

当我从ComboBox中选择颜色时,ObservableCollection会相应地更改。但是,如果我更改对象本身,则ComboBox将保留其原始值。

为了排除故障,我添加了

<DataGridTextColumn Header="Color" Binding="{Binding Color, UpdateSourceTrigger=LostFocus}" 
                    Width="100"/> 

此列将填充颜色的字符串表示形式,当我从任一侧更改值时,它会相应地更改。 这一事实表明,ComboBox实现中缺少一些东西。

我错过了某种翻译方法吗?看起来很奇怪,因为它实际上以一种方式工作(从ComboBox到对象)。

我到处寻找解决方案,但没有成功。

编辑: 我实现了Color&lt; - &gt; String转换器,仍然没有工作..

public class StringToColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        Color content = (Color)value;

        return content.ToString();
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string content = (string)value;

        return (Color)ColorConverter.ConvertFromString(content);
    }
}

WPF更改:

<ComboBox ItemsSource="{Binding Source={StaticResource ColorProperties}}" 
                                              SelectedItem="{Binding Path=Color, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, 
                                                             Converter={StaticResource StringToColorConverter}}"
                                              Style="{StaticResource ComboBoxFlatStyle}">

有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

绑定到Combobox的列表是一个字符串列表,而实际的对象不仅仅是一个字符串。你需要一个从字符串转换为你想要的对象的转换器。

休息一切似乎很好,系统剂量知道字符串Black如何转换为Color Black

- 单向绑定有效,因为颜色对象知道如何从字符串中获取颜色,这就是为什么当我们设置Background =&#34; String&#34;它使用FromName

获取相应的对象

答案 1 :(得分:0)

好的,我发现了什么问题。看起来从颜色中获取实际名称并不那么简单。 ToString返回十六进制字符串,而不是实际的颜色名称。 所以我用http://www.blogs.intuidev.com/post/2010/02/05/ColorHelper.aspx的答案来创建转换器。

public class ColorToStringConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        Color KnownColor;

        Color content = (Color)value;

        Type ColorType = typeof(System.Windows.Media.Colors);
        PropertyInfo[] ColorsCollection = ColorType.GetProperties(BindingFlags.Public | BindingFlags.Static);

        foreach (PropertyInfo pi in ColorsCollection)
        {
            KnownColor = (Color)pi.GetValue(null);
            if (KnownColor == content)
                return pi.Name;
        }

        return String.Empty;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string content = (string)value;

        return (Color)ColorConverter.ConvertFromString(content);
    }
}