我非常需要一个想法;
这让我感到困扰:
我有一个名为'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>"
我还不知道如何创建转换器,所以它仍在进行中......
如果您需要更多详细信息,请告诉我,或者我可以在邮件上发送一些小型演示... 非常感谢您的兴趣...
答案 0 :(得分:0)
您的视图模型应仅负责关联视图的表示逻辑。将转换器代码分离为新类型,然后您可以在适当的位置将其添加为资源。此外,假设您的CustomDropDown类型派生自ItemsControl,您可以使用DisplayMemberPath属性来设置在显示中使用底层数据绑定对象的哪个属性,或者如果您需要更多格式控制,则可以设置ItemTemplate属性。