У меня проблемы с использованием WPF ComboBox в следующем сценарии:
ViewModel
Предоставляет ObservableCollection<T>
;Эта коллекция содержит список элементов, которые пользователь может выбрать.
Предоставляет свойство типа T
, представляющее выбранный элемент.
пользователь должен иметь возможность выбрать либо существующий элемент из элементов ObservableCollection<T>
, либо добавить новый элемент, введя строковое представление.
У меня есть конвертер, способный преобразовать элемент типа T
до string
и наоборот.
Просмотр
Мой ComboBox привязан к коллекции и свойствам выбранного элемента:
<ComboBox ItemsSource="{Binding Path=MyObservableCollection}"
SelectedItem="{Binding Path=MySelectedItem}"
IsReadOnly="False" IsEditable="True"/>
шаблон данных, используемый для правильного отображения элементов:
<DataTemplate DataType="{x:Type T}">
<TextBlock Text="{Binding Converter={StaticResource ResourceKey=MyConverter}}"/>
</DataTemplate>
Проблема
Элементы в раскрывающемся списке ComboBox
отображаются правильно с помощью преобразования.Выбранный элемент, отображаемый в TextBox
из ComboBox
, отображается неправильно;Вместо моего конвертера используется метод ToString
.
Можно ли указать конвертер для свойства Text?Я попытался использовать следующий код:
<ComboBox ItemsSource="{Binding Path=MyObservableCollection}"
SelectedItem="{Binding Path=MySelectedItem}"
Text="{Binding Path=MySelectedItem, Converter={StaticResource ResourceKey=MyConverter}}"
IsReadOnly="False" IsEditable="True"/>
Это решает проблему с отображением, но теперь я получаю Type.FullName
T в методе преобразователей ConvertBack
- который, конечно, не может быть преобразован.
Сводка
Я хочу, чтобы пользователь мог выбрать элемент из коллекции, позволяя ему добавлять новые элементы, вводя строковое представление.Элементы в коллекции должны быть преобразованы между строковым и объектным представлением, используя конвертер.Преобразование должно быть выполнено как в раскрывающемся списке, так и в текстовом поле ComboBox.
Edit
Вот код в моем конвертере - никакой магии нетпрямое преобразование:
public class MyConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return MyConverter.Convert(value as T);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return MyConverter.Convert(value as string);
}
public static string Convert(T key)
{
// Conversion from T to string.
}
public static T Convert(string key)
{
// Conversion from string to T.
}
}
Хорошо, теперь я нашел то, что делает то, что я хочу:
<TextBox Text="{Binding Path=MySelectedItem, Converter={StaticResource ResourceKey=MyConverter}}"/>
<ListBox ItemsSource="{Binding Path=MyObservableCollection}"
SelectedItem="{Binding Path=MySelectedItem, Converter={StaticResource ResourceKey=MyConverter}}"/>
Это делает именно то, что я хочу;Я могу выбрать предопределенные значения, и пользователь может добавлять значения самостоятельно.Возможно ли это сделать с помощью ComboBox?