我想绑定对象列表,每个对象都有UIType(即文本框,复选框,组合等)。并且它具有对象Value属性。
我想将此列表绑定到ItemControl(ListBox,DataGrid ..),其中每个项目将具有与每个对象的特定UIType相对应的单独模板(例如,组合的项目将在行中具有组合,而项目用于复选框将有复选框)...
显然,prop值将绑定到每个项目的相关属性。
最透明,最简单的方法是什么?
Silverlight 5。
编辑:(基于雅各布解决方案的工作代码)
代码:
ObservableCollection<UIType> data;
public MainPage()
{
InitializeComponent();
data = new ObservableCollection<UIType>()
{
new UITypeTextBox() { Value = "Value.." },
new UITypeCheckBox(){ Value = true },
};
lb.ItemsSource = data;
}
public class UIType { }
public class UITypeTextBox : UIType { public object Value { get; set; }}
public class UITypeCheckBox : UIType { public object Value { get; set; } }
XAML:
<ListBox x:Name="lb">
<ListBox.Resources>
<DataTemplate DataType="local:UITypeTextBox">
<TextBox Text="{Binding Value}" />
</DataTemplate>
<DataTemplate DataType="local:UITypeCheckBox">
<CheckBox IsChecked="{Binding Value}" />
</DataTemplate>
</ListBox.Resources>
</ListBox>
答案 0 :(得分:2)
我不确定Silverlight,但在WPF中,您可以使用数据模板来执行此操作。对于每种UI类型,您可以定义一个数据模板,该模板基本上将类型映射到视图,该视图只是在XAML中定义的用户控件。
通常,您将在资源字典中定义数据模板:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:views="clr-namespace:MyApp.Views"
xmlns:uitypes="clr-namespace:MyApp.UITypes"
>
<DataTemplate DataType="{x:Type uitypes:TextBox}">
<views:TextBoxView />
</DataTemplate>
<DataTemplate DataType="{x:Type uitypes:CheckBox}">
<views:CheckBoxView />
</DataTemplate>
</ResourceDictionary>
您的视图将是从UserControl继承的XAML文件。例如,TextBox视图的XAML可能如下所示。
<UserControl x:Class="MyApp.Views.TextBox"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
<Grid>
<TextBox Text="{Binding Value}" />
</Grid>
</UserControl>
当您将UI类型添加到ItemControl时,WPF(并且希望Silverlight)自动将正确的视图拍摄。