2

ComboBox基本的にシンプルなカラーパレットとして機能するテンプレートを作成しました。オブジェクトのリストが表示されSolidColorBrushます。

また、現在の色の16進値を保持するデータと、16進をに変換するコンバーターもありSolidColorBrushます。

私が試しているのは、データソースの色に基づいてのSelectedItemプロパティを設定することです。ComboBox私のコンボにはタイプのオブジェクトが入力SolidColourBrushされており、バインディングコンバーターはを返すのでSolidColorBrush、次のように言うのと同じくらい簡単だと思いました。

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

しかし...それは動作しません:(

のBackgroundプロパティにまったく同じ値を使用して、バインディングが舞台裏で機能していることをテストしましたComboBox

したがって、SelectedItem = [something]とだけ言うことはできません。ここで、その[something]は、基本的に、選択したいアイテムと等しいオブジェクトです。

これを行う正しい方法は何ですか?確かに、バインディングを使用したXAMLのみのスタイリーで可能であり、コンボボックス内のすべてのアイテムを繰り返し処理して一致するものを見つけるために厄介なC#を実行する必要はありません(これはひどく古い学校のようです)...?

4

2 に答える 2

2

コンボボックスで SelectedItem をデータバインドできます。あなたの説明が理解できれば、16 進文字列のコレクションと 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# コードは古臭いと考えているため、C# コードを避けたいとのことを読みました。しかし、これは MVVM パターンの強みです。なぜなら、既に複雑なビジネス ロジックであるこのコードを正確に単体テストできるからです。これを XAML に入れることは、単体テストができないため、正しい機能を保証できないため、非常に安全ではありません (単体テストよりも実装がはるかに複雑な自動化された UI テストを除く)。

よろしく、
オリバー・ハナッピ

于 2010-04-15T13:04:46.777 に答える