1

我想绑定每个对象都有 UIType 的列表(即文本框、复选框、组合等)。它具有对象值属性。

我想将此列表绑定到 ItemControl(ListBox,DataGrid..),其中每个项目将具有与每个对象的特定 UIType 对应的单独模板(例如,组合项目将在行中具有组合,复选框项目将具有复选框) ...

显然 prop Value 将绑定到每个项目的相关属性。

实现这一目标的最透明且不太复杂的方法是什么?

银光 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; } }

xml:

<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>
4

1 回答 1

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)会自动绘制正确的视图。

于 2012-09-28T15:30:34.080 回答