数据绑定在xaml.cs文件中不起作用

gwbalxhn  于 2023-06-19  发布在  其他
关注(0)|答案(2)|浏览(151)

我正在尝试将模型中的一些数据加载到xaml.cs文件中。但它不起作用。在我的Mainpage.xaml中,我在标签中有一个绑定属性。在后面的代码文件BindingContext到我的ViewModel和有我有一个列表与一些类型的数据我错过了什么吗?
MainPage.xaml

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="DatabindingNavListExample.MainPage"
             xmlns:models="clr-namespace:DatabindingNavListExample.Models"
             xmlns:viewmodels="clr-namespace:DatabindingNavListExample.ViewModels">
    <ScrollView>
        <VerticalStackLayout>
            <Label FontSize="50" Text="{Binding Userdata.Username}" />
            <Label FontSize="50" Text="{Binding Userdata.Firstname}" />
            <Label FontSize="50" Text="{Binding Userdata.Lastname}" />
        </VerticalStackLayout>
    </ScrollView>
</ContentPage>

MainPage.xaml.cs

using DatabindingNavListExample.ViewModels;
namespace DatabindingNavListExample;
public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
        BindingContext = new MainPageViewModel();
    }
}

MainPageViewModel.cs

using DatabindingNavListExample.Models;

namespace DatabindingNavListExample.ViewModels {
    public class MainPageViewModel {

        public List<UserModel> Userdata { get; set; } = new();

        public MainPageViewModel() { 
            Userdata.Add(new UserModel() { Username = "test", Firstname = "John", 
            Lastname = "Doe"});
        }
    }
}

UserModel.cs

using System.ComponentModel;
using System.Runtime.CompilerServices;

namespace DatabindingNavListExample.Models {
    public class UserModel : INotifyPropertyChanged {
    private string username;
    private string firstname;
    private string lastname;

    public string Username {
        get => username; set {
            username = value;
            OnPropertyChanged();
        }
    }
    public string Firstname {
        get => firstname; set {
            firstname = value;
            OnPropertyChanged();
        }
    }
    public string Lastname {
        get => lastname; set {
            lastname = value;
            OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged([CallerMemberName] string propName = null) {
        PropertyChanged?.Invoke(this,
             new PropertyChangedEventArgs(propName));
    }
}

}

ghhaqwfi

ghhaqwfi1#

由于Userdata只包含UserModel的一个示例,因此您需要按照Jason的建议显式分配它,如下所示:

<ScrollView>
        <VerticalStackLayout>
            <Label FontSize="50" Text="{Binding Userdata[0].Username}" /> 
            <Label FontSize="50" Text="{Binding Userdata[0].Firstname}" />
            <Label FontSize="50" Text="{Binding Userdata[0].Lastname}" />
        </VerticalStackLayout>
 </ScrollView>
31moq8wy

31moq8wy2#

当你想在WPF中使用集合作为绑定时,你应该使用ObservableCollection<T>而不是List<T>
ObservableCollection<T>具有已经内置的INotifyPropertyChanged接口的功能,而常规的List<T>没有。
如果您的List<T>是预填充的,而不仅仅是new List<T>(),那么您实际上会看到一些数据显示在您的UI中。但是,对List<T>中的数据所做的任何更改都不会转换到您的UI,因为UI不会收到该List中的数据已更改的通知。

相关问题