2

我已经模板化ComboBox了,它基本上充当了一个简单的调色板。它填充了SolidColorBrush对象列表。

我还有一些保存当前颜色的十六进制值的数据和一个将十六进制转换为SolidColorBrush.

我正在尝试的是根据我的数据源中的颜色设置SelectedItem属性。ComboBox由于我的组合填充了 type 的对象SolidColourBrush,并且我的绑定转换器返回 a SolidColorBrush,我认为这很简单:

SelectedItem="{Binding Color, Converter={StaticResource StringToBrush}}"

但是......它不起作用:(

我已经通过对ComboBox.

所以,很明显,我不能只说 SelectedItem = [something],其中 [something] 基本上是一个等于我想要被选中的项目的对象。

这样做的正确方法是什么?当然,在仅 XAML 的样式中使用绑定是可能的,而且我不必做一些讨厌的 C# 迭代组合框中的所有项目来尝试找到匹配项(这看起来非常老派)......?

4

2 回答 2

2

您可以在组合框上对 SelectedItem 进行数据绑定。如果我理解您的描述,您有一组十六进制字符串和一个名为 Color 的 SolidColorBrush 属性。以下代码在更改选定项目时更新 Color 属性。

XAML:

<Window x:Class="SelItemTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:SelItemTest="clr-namespace:SelItemTest"
    Title="Window1" Height="300" Width="300">

    <Window.Resources>        
        <SelItemTest:StringToBrushConverter x:Key="StringToBrush" />        
    </Window.Resources>

    <StackPanel Background="{Binding Path=Color}">
        <ComboBox
            ItemsSource="{Binding Path=Colors}"
            SelectedItem="{Binding Path=Color, Converter={StaticResource StringToBrush}}">
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <Border Background="{Binding}" Height="20" Width="100" />
                </DataTemplate>
            </ComboBox.ItemTemplate>
        </ComboBox>
    </StackPanel>

</Window>

后面的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows;
using System.Windows.Data;
using System.Windows.Media;

namespace SelItemTest
{
    public partial class Window1 : Window, INotifyPropertyChanged
    {
        public Window1()
        {
            InitializeComponent();

            Colors = new List<string>();
            Colors.Add(Brushes.Red.ToString());
            Colors.Add(Brushes.Blue.ToString());
            Colors.Add(Brushes.Yellow.ToString());

            Color = Brushes.Yellow;

            DataContext = this;
        }

        public List<string> Colors { get; set;}

        private SolidColorBrush _color;
        public SolidColorBrush Color
        {
            get { return _color; }
            set
            {
                _color = value;
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("Color"));
                }
            }
        }

        #region INotifyPropertyChanged Members
        public event PropertyChangedEventHandler PropertyChanged;
        #endregion
    }

    public class StringToBrushConverter : IValueConverter
    {
        #region IValueConverter Members
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return value.ToString();
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            Color color = (Color)ColorConverter.ConvertFromString(value.ToString());
            SolidColorBrush scb = new SolidColorBrush(color);
            return scb;
        }
        #endregion
    }
}
于 2010-04-15T14:23:07.860 回答
0

我正在使用 MVVM 模式,然后向视图模型添加一个属性SelectedHexColor,让视图模型在列表中搜索正确的纯色画笔,从中填充颜色画笔组合框,并更新SelectedBrush视图模型的属性组合框的选定项被绑定。

[编辑] 我刚刚读到你想避免使用 C# 代码,因为你认为它是老派的。但这是 MVVM 模式的优势,因为您可以准确地对已经是复杂业务逻辑的代码进行单元测试。将它放在 XAML 中是非常不安全的,因为您无法对其进行单元测试,因此您无法保证正确的功能(除了自动化 ui 测试,它的实现比单元测试更复杂)。

最好的问候,
奥利弗·哈纳皮

于 2010-04-15T13:04:46.777 回答