【问题标题】:Create Silverlight controls dynamically for each ItemsControl item为每个 ItemsControl 项动态创建 Silverlight 控件
【发布时间】:2012-09-28 14:45:56
【问题描述】:

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

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

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

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

银光 5.

编辑:(基于 Jacob 解决方案的工作代码)

代码:

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>

【问题讨论】:

    标签: c# wpf silverlight .net-4.0


    【解决方案1】:

    我不确定 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)会自动生成正确的视图。

    【讨论】:

    • 上次我检查过,Silverlight 不支持隐式 DataTemplates(没有 x:Key 的数据模板)。另一种方法是使用DataTemplateSelector,它根据项目类型返回一个模板
    • 我真的很想不创建整个用户控件来满足像文本框或组合这样的一个通用控件......所有这些 mvvm 历史都太模糊了
    • @Rachel:Silverlight 5 确实支持隐式 DataTemplates,请参阅 jesseliberty.com/2011/04/21/…。 Bobb 在他的问题中指定他正在使用 SL5。
    • @Bobb 你不需要在DataTemplate 中使用UserControl;您可以简单地在那里编写您想要的任何控件。谢谢 Jakob,我没有意识到 SL5 终于有了隐式 DataTemplates :)
    • 我知道数据模板的样子。您的回答缺少关键信息 - 我如何为每个项目单独设置模板?
    猜你喜欢
    • 1970-01-01
    • 2011-04-05
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    相关资源
    最近更新 更多