通过xaml中的数据绑定,根据对象类型动态加载不同的UserControl

时间:2012-12-06 21:16:54

标签: wpf xaml data-binding

WPF中是否有某种方法可以获得相同的功能DataTemplateSelector,但是对于UserControls?

假设我有一个StackView,我想绑定一个IEnumerable对象。我想要做的是以某种方式有一个映射,对于绑定的IEnumerable中的每个对象类型,查看对象类型并确定要添加到StackView的UserControl。

所以,给出了三个类:

public class House : Building{}

public class Apartment : Building{}

public class Tent : Building{}

其中每个类都继承自Building并且有自己定义的UserControl,我想将DataContext设置为IEnumerable<Building>并以某种方式让StackView填充它具有特定于类型的UserControl的子集。

我想用尽可能少的代码来做到这一点。数据绑定和XAML管道胶带越多越好。

2 个答案:

答案 0 :(得分:6)

您可以在DataTemplate中使用复杂的用户控件;只需将DataTemplate声明为UserControl即可。

示例:

  <Window x:Class="WpfApplication4.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:WpfApplication4"
            Title="MainWindow" Height="300" Width="300" Name="UI" >
        <Window.Resources>
            <DataTemplate DataType="{x:Type local:House}" >
                <local:HouseUserControl DataContext="{Binding}"/>
            </DataTemplate>
            <DataTemplate DataType="{x:Type local:Apartment}">
                 <local:ApartmentUserControl DataContext="{Binding}"/>
            </DataTemplate>
        </Window.Resources>

        <Grid>
            <ListBox ItemsSource="{Binding ElementName=UI, Path=ListOfBuildings}" />
        </Grid>
    </Window>

答案 1 :(得分:2)

我不确定我是否看到了这个问题。只需在某处为资源中的每种类型创建DataTemplates,WPF将自动使用它们来呈现每种类型。

相关问题