MVVM: связывающие преобразователи со строго типизированным DataContext - PullRequest
0 голосов
/ 29 декабря 2010

Мне очень нужна идея;

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

У меня есть один вид, названный «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 Convertor я получаю исключение времени выполнения: Ошибка в привязке ... Без этого я могу видеть выпадающие значения, заполненные как и ожидалось (пользовательский 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, который мог бы использоваться для Преобразователя ...

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

@ devdigital

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

1031 * т.е. *

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

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

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

1 Ответ

0 голосов
/ 29 декабря 2010

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

...