Listview绑定问题

本文关键字:问题 绑定 Listview | 更新日期: 2023-09-27 17:59:59

我有以下类:

class MyViewModel
{
    public List<MyItem> MyItems { get; set; }
    public int Width { get; set; }
}
class MyItem
{
    public string Name {get; set;}
}

正如您所看到的,在同一个名为MyViewModel的类中有一个MyItems和Width属性的列表。如何将该列表的单个元素绑定到XAML中的Text属性,并将Width from ViewModel绑定到XAML的Width属性?这是我的尝试,但我不能同时绑定这两个属性。我的意思是,我可以将整个列表绑定到Text属性,但我不知道如何绑定单个项。

<ListView ItemsSource="{Binding MyViewModel}">
<ListView.ItemTemplate>
    <DataTemplate>
        <Grid Height="15" Width="520">
            <TextBlock Width="{Binding Width}" Text="{Binding=MyItems.Name(?)}" />
        </Grid>
    </DataTemplate>
</ListView.ItemTemplate>

Listview绑定问题

你应该修改你的设计,但这里有一个快速的解决方案:只需引入一个只读属性,它返回第一个元素,所以你会得到这个(假设MyItems总是有至少一个元素,否则你会得到一个异常):

class MyViewModel
{
    public List<MyItem> MyItems { get; set; }
    public int Width { get; set; }
    public MyItem FirstElement { get { return MyItems[0]; } }
}

在xaml中,您将TextBlock绑定到此属性:

<ListView ItemsSource="{Binding MyViewModel}">
<ListView.ItemTemplate>
    <DataTemplate>
        <Grid Height="15" Width="520">
            <TextBlock Width="{Binding Width}" Text="{Binding=FirstElement}" />
        </Grid>
    </DataTemplate>
</ListView.ItemTemplate>

有点偏离主题,但仍然很重要:视图模型类通常实现INotifyPropertyChanged,这样视图就能够自动更新自己。出于同样的原因,应将List<T>替换为ObservableCollection<T>