2010-12-29 4 views
0

Мне очень нужна идея;MVVM: переплетные конвертеры с сильно типизированным DataContext

Это то, что меня беспокоит:

Я один вид, названный «DropDownView» Это, как я использую его:

<control:DropDownView DataContext="{Binding StronglyTypedViewModel}"/> 

Значение, что в родительской странице ViewModel, у меня есть свойство типа: StronglyTypedViewModel<T>

Теперь, когда представлен вид, все это работает отлично, как я ожидаю;

Однако эти несколько строк из DropDownView являются тревожным поведением:

<ctrl:CustomDropDown x:Name="cc" 
            ItemsSource="{Binding ControlData}" 
            ItemTemplate="{Binding ControlItemTemplate}" 
            SelectedItem="{Binding ControlSelectedItem, ConverterParameter={Binding ControlData}, Converter={Binding}, Mode=TwoWay}" 
... 

С набором свойств SelectedItem конвертера, я получаю исключение во время выполнения: Ошибка в связывании ... Без него я могу видеть выпадающие значения заполнены, как ожидалось (пользовательский ItemTemplate привязан), но представлен как object.ToString()!

Я сильно типизированных ViewModel, то есть я должен был сильно типизированных конвертер, который объявлен в ViewModel, как:

public class SMOEntityProcessingViewModel<T> : CustomViewModelBase, IValueConverter 
... 
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 

Но, так как я не знаю, тип ViewModel во время компиляции я не могу добавить StaticResource для ViewModel, которые могут быть использованы для Convertor ...

Любая помощь приветствуется ... Спасибо

@devdigital

ObservableCollection<T> ControlData; 
object ControlSelectedItem; 
ControlItemTemplate = Helpers.XAML.Methods.GenerateDataTemplate("{Binding Path=" + _propertyToShow + "}"); 
---------generating this in VM constructor, _propertyToShow depends on the T 

т.е.

"<DataTemplate "); 
"xmlns='http://schemas.microsoft.com/winfx/" 
"2006/xaml/presentation' " 
"xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' >" 
"<TextBlock Text='" + _propertyToShow + "' />" 
"</DataTemplate>" 

Я не знаю, как создать конвертер еще, так что все еще продолжается ...

Пожалуйста, дайте мне знать, если вам нужно более подробно, или, возможно, я мог бы отправить небольшую демо-почту по почте ... Большое спасибо за интерес ...

ответ

0

Ваша модель просмотра должна отвечать только за логику представления ассоциированного v МЭН. Отделите код конвертера на новый тип, а затем вы можете добавить его как ресурс, где это необходимо. Кроме того, если ваш тип CustomDropDown происходит из ItemsControl, вы можете использовать свойство DisplayMemberPath, чтобы установить, какое свойство базового объекта привязки данных используется на дисплее, или вы можете установить свойство ItemTemplate, если вам нужно больше управления форматированием.

+0

Базовый элемент управления - AutoCompleteBox; Если ValueMemberPath привязан-> runtime ex .; Если ValueMemberBinding вместо-> приложение зависает; Разделенный конвертер должен каким-то образом узнать, что такое входящий тип и какое свойство преобразовать ... Должен ли я рассмотреть возможность передачи параметров (dependencyproperty) в DropDownView и связать их в конвертере? – dvox

+0

Трудно сказать, не видя еще кода. Каковы типы ControlData и ControlSelectedItem, и как выглядит ControlItemTemplate? Если вы создадите отдельный конвертер и разместите полный обновленный код, который будет полезен. – devdigital