WPF производная проблема ComboBox SelectedValuePath

В нашем приложении у нас есть очень большой набор данных, который действует как наш словарь данных для списков ComboBox и т. Д. Эти данные статически кэшируются и привязаны к двум переменным, поэтому я подумал, что было бы разумно написать элемент управления, производный от ComboBox и открытый 2 ключа как DP. Когда эти 2 ключа имеют правильные значения, я автоматически устанавливаю ItemsSource ComboBox из списка словаря данных, которому он соответствует. Я также автоматически устанавливаю для SelectedValuePath и DisplayMemberPath в конструкторе значения Code и Description соответственно.

Вот как всегда выглядит элемент в ItemsSource из списка словаря данных:

public class DataDictionaryItem
{
    public string Code { get; set; }
    public string Description { get; set; }
    public string Code3 { get { return this.Code.Substring(0, 3); } }
}

Значение кода всегда составляет 4 символа, но иногда мне нужно связать только 3 символа. Следовательно, свойство Code3.

Вот как выглядит код внутри моего настраиваемого поля со списком для установки ItemsSource:

private static void SetItemsSource(CustomComboBox combo)
{
    if (string.IsNullOrEmpty(combo.Key1) || string.IsNullOrEmpty(combo.Key2))
    {
        combo.ItemsSource = null;
        return;
    }

    List<DataDictionaryItem> list = GetDataDictionaryList(combo.Key1, combo.Key2);
    combo.ItemsSource = list;
}

Теперь моя проблема в том, что когда я меняю SelectedValuePath в XAML на Code3, это не работает. То, что я привязываю к SelectedValue, по-прежнему получает полный 4-символьный код из DataDictionaryItem. Я даже попытался повторно запустить SetItemsSource, когда SelectedValuePath был изменен, а кости не было.

Может ли кто-нибудь увидеть, что мне нужно сделать, чтобы мое настраиваемое поле со списком просыпалось и использовало предоставленный SelectedValuePath, если он переопределен в XAML? Изменение значения в установщике свойств в моем связанном бизнес-объекте SelectedValue не является вариантом.

Вот как XAML ищет мое поле со списком в форме:

<c:CustomComboBox Key1="0" Key2="8099" SelectedValuePath="Code3" SelectedValue="{Binding Thing}"/>

РЕДАКТИРОВАТЬ: я только что запустил отслеживание своего кода, и он говорит, что мой SelectedValuePath - это код ... похоже, он никогда не был установлен на Code3 ... Зах?


person opedog    schedule 08.03.2010    source источник
comment
Да, это неприятный код, но это также пример кода, чтобы не вставлять сюда все мое приложение.   -  person opedog    schedule 09.03.2010
comment
(Между прочим, это 8 байтов и 6, а не 4 байта и 3.)   -  person Robert Rossney    schedule 09.03.2010
comment
Хорошо, пояснил, я имел в виду символы вместо байтов.   -  person opedog    schedule 10.03.2010


Ответы (1)


Хорошо, я разобрался.

По-видимому, установка значений по умолчанию для DependencyProperty в нестатическом конструкторе по умолчанию элемента управления WPF - это нет-нет. Итак, сначала я попробовал это:

static ValueCodeListComboBox()
{
  SelectedValuePathProperty.OverrideMetadata(typeof(ValueCodeListComboBox), new PropertyMetadata("Code"));
  DisplayMemberPathProperty.OverrideMetadata(typeof(ValueCodeListComboBox), new PropertyMetadata("Description"));
}

Но это продолжало выдавать ошибку:

Переопределение метаданных и базовые метаданные должны быть одного и того же типа или производного типа.

Наконец понял, что это означает, что мне нужно использовать FrameworkPropertyMetadata вместо PropertyMetadata:

static ValueCodeListComboBox()
{
  SelectedValuePathProperty.OverrideMetadata(typeof(ValueCodeListComboBox), new FrameworkPropertyMetadata("Code"));
  DisplayMemberPathProperty.OverrideMetadata(typeof(ValueCodeListComboBox), new FrameworkPropertyMetadata("Description"));
}

Теперь изменение SelectedValuePath в XAML отлично работает.

person opedog    schedule 09.03.2010