绑定到集合时的条件DataTemplates

use*_*056 1 wpf wpf-controls

样品申请:

提供的代码所属的示例应用程序Vehicle通过Binding 显示对象列表.本Vehicle类是顶层类子类可以从如派生CarBike.此时的示例应用程序显示所有者的名称Vehicle.

示例型号代码:

public class Vehicle
{
    private string _ownerName;
    public string ownerName
    {
        get { return _ownerName; }
        set { _ownerName = value; }
    }
}

public class Car : Vehicle
{
    public int doors;
}

public class Bike : Vehicle
{
    // <insert variables unique to a bike, ( I could not think of any...)>
}
Run Code Online (Sandbox Code Playgroud)

UserControl XAML代码:

<Grid>
    <Grid.Resources>
        <DataTemplate x:Key="itemTemplate">
            <WrapPanel>
                <TextBlock Text="{Binding Path=ownerName}"/>
            </WrapPanel>
        </DataTemplate>
    </Grid.Resources>
    <ListBox x:Name="list" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="5" ItemsSource="{Binding}" ItemTemplate="{StaticResource itemTemplate}" />
</Grid>
Run Code Online (Sandbox Code Playgroud)

UserControl代码背后:

    public List<Vehicle> vehicleList = new List<Vehicle>();

    public CustomControl()
    {
        InitializeComponent();
        createSomeVehicles();
        list.DataContext = vehicleList;
    }

    public void createSomeVehicles()
    {
        Car newcar = new Car();
        newcar.doors = 5;
        newcar.ownerName = "mike";

        Bike newbike = new Bike();
        newbike.ownerName = "dave";

        vehicleList.Add(newcar);
        vehicleList.Add(newbike);
    }
Run Code Online (Sandbox Code Playgroud)

我希望能做什么:

我希望能够根据对象的类型在列表对象中显示一个按钮Vehicle.例如,我想Open Boot在列表项中显示一个按钮Car; 类型Bike没有启动,因此列表项中不会显示任何按钮.

想法如何实现这一目标:

我根据它的对象类型研究了不同DataTemplates的自定义绑定.例如,我可以调用后面的代码:

object.Template = (ControlTemplate)control.Resources["templateForCar"];

这里的问题是我在整个列表中使用Binding,因此没有办法手动将DataTemplate绑定到每个列表项,列表绑定控制它的项的DataTemplate.

Jak*_*ger 5

您可以为每个Bike和Car(以及任何CLR类型)创建DataTemplate.通过指定DataTemplate's DataType属性,只要WPF看到该类型,就会自动应用该模板.

<Grid>
    <Grid.Resources>
        <DataTemplate DataType="{x:Type local:Car}">
            <WrapPanel>
                <TextBlock Text="{Binding Path=ownerName}"/>
                <Button Content="Open Boot" ... />
            </WrapPanel>
        </DataTemplate>
        <DataTemplate DataType="{x:Type local:Bike}">
            <WrapPanel>
                <TextBlock Text="{Binding Path=ownerName}"/>
            </WrapPanel>
        </DataTemplate>
    </Grid.Resources>
    <ListBox x:Name="list" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="5" ItemsSource="{Binding}" />
</Grid>
Run Code Online (Sandbox Code Playgroud)