MVVM:绑定转换器与强类型DataContext

时间:2010-12-29 14:57:08

标签: mvvm binding datacontext converter ivalueconverter

我非常需要一个想法;

这让我感到困扰:

我有一个名为'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的类型,我无法为ViewModel添加一个可用于转换器的StaticResource ...

感谢任何帮助...... 感谢

@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>"

我还不知道如何创建转换器,所以它仍在进行中......

如果您需要更多详细信息,请告诉我,或者我可以在邮件上发送一些小型演示... 非常感谢您的兴趣...

1 个答案:

答案 0 :(得分:0)

您的视图模型应仅负责关联视图的表示逻辑。将转换器代码分离为新类型,然后您可以在适当的位置将其添加为资源。此外,假设您的CustomDropDown类型派生自ItemsControl,您可以使用DisplayMemberPath属性来设置在显示中使用底层数据绑定对象的哪个属性,或者如果您需要更多格式控制,则可以设置ItemTemplate属性。