Полученная в WPF проблема ComboBox SelectedValuePath - PullRequest
3 голосов
/ 09 марта 2010

В нашем приложении у нас есть очень большой набор данных, который действует как наш словарь данных для списков 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}"/>

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

1 Ответ

4 голосов
/ 09 марта 2010

Хорошо, я понял это.

Видимо, установка значений по умолчанию для 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 прекрасно работает.

...