在Xamarin.Forms中,如何绑定到自定义列表类,为ListView打印自定义类属性?

8tntrjer  于 2022-12-16  发布在  其他
关注(0)|答案(2)|浏览(196)

在.xaml文件中,我尝试绑定到列出的自定义类作为ObeservableCollection对象。我可以成功更新变量并更新ObservableCollection。我可以检查它,将其呈现为:

<ListView ItemSource="{Binding myCustomObservableCollection}"/>

字符串
然而,即使我可以确定列表中的条目数,我也无法访问我的自定义类的属性。我尝试了这个方法,但没有成功,因为列表的行是空的。即使使用Text="{Binding Id}"也不起作用,因为它告诉我“Id”不是myCustomViewModel中的属性:

<ListView
            x:DataType="vm:CustomtViewModel"
            BackgroundColor="LightSlateGray"
            HasUnevenRows="True"
            HorizontalOptions="FillAndExpand"
            ItemsSource="{Binding myCustomObservableCollection}"
            SeparatorColor="Black">
            <ListView.ItemTemplate>
                <DataTemplate>
                   <label Text="{Binding Source={StaticSource myCustomClass}", Path=Id}/>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

当然,我已经将我的自定义类插入到.xaml中:

<ContentPage.Resources>
    <local:myCustomClass x:Key="myCustomClass" />
</ContentPage.Resources>

Id是我的Models中的公共类所需的属性之一

namespace myApp.Models {
public class myCustomClass : INotifyPropertyChanged
{
    private string _id;
       public event PropertyChangedEventHandler PropertyChanged;
       public string Id
       {
        get => _id;
        set { 
            _id = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Id)));
            }
        }
    }
}

所以我想知道如何有效地读取列表中的每一个条目作为一个对象,以便解析其中的属性。
非常感谢

2ul0zpep

2ul0zpep1#

你看过关于ListView中绑定单元格的官方文档了吗?myCustomClass不必从INotifyPropertyChanged接口继承。
只需确保视图模型中存在public ObservableCollection<myCustomClass> { get; set; }即可,例如:

public class CustomtViewModel
{
     public ObservableCollection<myCustomClass> myCustomObservableCollection { get; set; }
     public CustomtViewModel()
     {
       // you can initialize the myCustomObservableCollection's data in the construction method.
     }
}

另外,我看到你的列表视图使用了x:DataType="vm:CustomtViewModel",官方文件说:
将VisualElement的x:DataType属性设置为VisualElement及其子元素将绑定到的对象的类型。
所以你可以像Jason说的那样绑定ID:

<ListView.ItemTemplate>
     <DataTemplate>
          <Label Text={Binding Id}/>
     </DataTemplate>
</ListView.ItemTemplate>

另外,你可以参考github上关于listview mvvm绑定的官方示例,这是viewmodel's codepage's code

jaql4c8m

jaql4c8m2#

也要感谢张丽云和ToolmakerSteve,我想出了一个解决方案。设置正确的x:DataType确实很重要,我发现它甚至可以多次指向不同的类,链接不同类型的数据。

<ListView
            x:Name="customListName"
            x:DataType="vm:CustomViewModel"
            ItemsSource="{Binding myCustomObservableCollection}">
            <ListView.ItemTemplate>
                <DataTemplate x:DataType="local:myCustomClass"> <!--THIS SAVED THE DAY-->
                    <ViewCell>
                        <Label Text="{Binding Id}" /> 
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

现在,从list中提取的对象被正确地读取,引用了它自己的类。
技巧是在xaml中添加了一个引用之后,将x:DataType="local:myCustomClass"添加到DataTemplate标记中,如下所示:

<ContentPage.Resources>
    <local:myCustomClass x:Key="myCustomClass" />
</ContentPage.Resources>

(我也在这里插入这一点,以便在其他人遇到同样的问题时阅读)
它就像一个魅力!
希望这能让其他人免于头痛!干杯。

相关问题