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