首页 > 解决方案 > UWP ListView DataTemplate 绑定到项目而不是属性

问题描述

如何将数据模板中的项目绑定到项目本身,而不是该项目的属性?

我有一个将项目作为模型的用户控件。鉴于这些模型:

public class Car
{
    public string Name { get; set; }
    public Color color { get; set; }
    public string Model { get; set; }
}

public MyUserControl : UserControl
{
    public Car Model { get; set; }
}

public MyPage : Page
{
    public ObservableCollection<Car> CareList { get; set; }
}

我想在 XAML 中做这样的事情:

<ListView ItemsSource="{x:Bind CarList}">
    <ListView.ItemTemplate>
        <DataTemplate x:DataType="models:Car">
            <StackPanel>

                <!-- Binding to properties of Car is simple... -->
                <TextBlock Text="{x:Bind Name}">

                <!-- But what if I want to bind to the car itself ??? -->
                <userControls:MyUserControl Model="{x:Bind Car}">
                </userControls:MyUserControl>

            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

标签: xamllistviewdata-bindinguwp

解决方案


@user2819245 的评论是正确的,如果您不指定Path绑定的,那么DataContext将直接绑定对象。

在 UWP 中,如果您的列表源可以在运行时更改或延迟加载,那么您可能还需要指定Mode=OneWay,这是由于{x:Bind}默认为OneTime绑定模式。

此示例包括如何Mode在两个用例中设置属性

<ListView ItemsSource="{x:Bind CarList, Mode=OneWay}">
    <ListView.ItemTemplate>
        <DataTemplate x:DataType="models:Car">
            <StackPanel>

                <!-- Binding to properties of Car is simple... -->
                <TextBlock Text="{x:Bind Name, Mode=OneWay}">

                <!-- Binding to the car itself (as the DataContext of this template) -->
                <userControls:MyUserControl Model="{x:Bind Mode=OneWay}">
                </userControls:MyUserControl>

            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

推荐阅读