Установка ComboBox.SelectedItem в XAML на основе соответствующего объекта - PullRequest
1 голос
/ 15 апреля 2010

У меня есть шаблон ComboBox, который в основном действует как простая цветовая палитра. Он заполняется списком SolidColorBrush объектов.

У меня также есть некоторые данные, которые содержат шестнадцатеричное значение текущего цвета, и конвертер, который преобразует гекс в SolidColorBrush.

Я пытаюсь установить свойство SelectedItem для ComboBox на основе цвета из моего источника данных. Так как моя комбинация заполнена объектами типа SolidColourBrush, а конвертер привязки возвращает SolidColorBrush, я предположил, что это будет так просто, как сказать:

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

Однако ... это не работает: (

Я проверил, что привязка работает за кулисами, используя точно такое же значение для свойства Background ComboBox.

Итак, ясно, что я не могу просто сказать SelectedItem = [что-то], где это [что-то] в основном является объектом, равным элементу, который я хочу выбрать.

Как правильно это сделать? Конечно, это возможно в XAML-стиле с использованием привязки, и мне не нужно делать какой-то неприятный C #, перебирающий все элементы в выпадающем списке, пытаясь найти совпадение (которое кажется ужасно старым) ...?

Ответы [ 2 ]

1 голос
/ 15 апреля 2010

Вы можете привязать выбранный элемент к списку. Если я понимаю ваше описание, у вас есть коллекция шестнадцатеричных строк и свойство SolidColorBrush с именем Color. Приведенный ниже код обновляет свойство 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
    }
}
0 голосов
/ 15 апреля 2010

Если вы используете шаблон MVVM, затем добавьте свойство SelectedHexColor в модель представления и позвольте модели просмотра найти правильную однотонную кисть в вашем списке, из которой заполняется комбинированный список цветных кистей, и обновите SelectedBrush свойство модели вашего вида, к которому привязан выбранный элемент списка.

[править] Я только что прочитал, что вы хотите избежать C # кода, потому что вы думаете, что это старая школа. Но это сильная сторона шаблона MVVM, потому что вы можете модульно протестировать именно этот код, который уже является сложной бизнес-логикой. Вставить это в XAML довольно небезопасно, потому что вы не можете выполнить его модульное тестирование и, следовательно, вы не можете гарантировать правильную функциональность (за исключением автоматических тестов пользовательского интерфейса, которые намного сложнее реализовать, чем модульные тесты).

С наилучшими пожеланиями,
Оливер Ханаппи

...