为每个ItemsControl项动态创建Silverlight控件

时间:2012-09-28 14:45:57

标签: c# wpf silverlight .net-4.0

我想绑定对象列表,每个对象都有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>

1 个答案:

答案 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)自动将正确的视图拍摄。