将属性绑定到 Xamarin 中的 ListView,不会更新视图

Posted

技术标签:

【中文标题】将属性绑定到 Xamarin 中的 ListView,不会更新视图【英文标题】:Binding properties to a ListView in Xamarin, does not update the View 【发布时间】:2020-11-07 14:38:38 【问题描述】:

我在将属性绑定到 Xamarin Forms 中的 ListView 时遇到问题。我想做的是:

        
            InitializeComponent();
            //Task.Run(async () => await GetTaskDetails());


            GetTasks();

        

        ObservableCollection<XMCTasks> _userTasks;

        private async void GetTasks()
        
            using (var client = new HttpClient())
            
                string userId = "";
                if(Application.Current.Properties["userId"] != null)
                
                    userId = Application.Current.Properties["userId"].ToString();
                
                var uri = "http://diplomaxmcws-dev.us-east-2.elasticbeanstalk.com/api/Tasks/GetUserTasks?userId=" + userId;
                var result = await client.GetStringAsync(uri);
                var TaskList = JsonConvert.DeserializeObject<List<XMCTasks>>(result);
                UserTasks = new ObservableCollection<XMCTasks>(TaskList);
            
        

        public ObservableCollection<XMCTasks> UserTasks
        
            get
            
                return _userTasks;
            
            set
            
                _userTasks = value;
                OnPropertyChanged();
            
        

从 Rest API 调用中获取对象列表,然后将这些对象绑定到 ListView:

<ListView ItemsSource="Binding UserTasks">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell>
                            <ViewCell.View>
                                <StackLayout>
                                   <!-- <Label Text="Binding XMCTask_Id, StringFormat='XMCTask_Id: 0:F0)'"></Label> -->
                                    <Label Text="Binding Task_Name, StringFormat='Task_Name: 0:F0)'" TextColor="Black" FontSize="Medium"></Label>
                                    <!-- <Label Text="Binding Task_Description, StringFormat='Task_Description: 0:F0)'"></Label>
                                    <Label Text="Binding Creator_Id, StringFormat='Creator_Id: 0:F0)'"></Label> 
                                     <Label Text="Binding Referencer_Id, StringFormat='Referencer_Id: 0:F0)'"></Label>
                                    <Label Text="Binding XMCPune_Id, StringFormat='XMCPune_Id: 0:F0)'"></Label>
                                    <Label Text="Binding XMCProjekt_Id, StringFormat='XMCProjekt_Id: 0:F0)'"></Label>
                                    <Button Text="Binding XMCTipologjia_Id, StringFormat='XMCTipologjia_Id: 0:F0)'"></Button>-->
                                </StackLayout>
                            </ViewCell.View>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>

我不知道它是否与 Xamarin 表单页面的生命周期有关。只是为了让您知道,成功登录后会加载此页面。由于从 Web 服务获取结果的过程是异步的,因此可能会出现问题。非常感谢任何方法。

【问题讨论】:

您还没有告诉我们真正的问题是什么。您是否能够从您的服务中获取数据?您能否找到 ItemsSource 的数据?您是否在绑定数据模板中的单个元素时遇到问题?您在哪里设置页面的 BindingContext?为什么要从构造函数调用异步方法? 对,我认为它会被暗示。是的,我的服务正在正确返回数据。我在构造函数中调用异步方法,因为我想在页面加载时显示该信息(任务)。由于我使用 xamarin 形式,.xaml 负责设计,.cs 是一种控制器,考虑到它,MMVM 是这种设计模式的调用方式。我认为设计中的 ItemsSource 属性就足够了,在“控制器”中声明绑定上下文可能至少是多余的。 你没有回答我的问题。您是否获得任何数据行?或者你得到没有绑定数据的行?你在设置 BindingContext 吗?如果要调用异步方法,请从 OnAppearing 执行,而不是构造函数。 是的,我从服务中获取数据。 OnAppearing 似乎正在工作,但从调试的角度来看,没有任何变化。在这两种情况下,绑定属性都得到了正确填充。我想更多地了解事情是如何执行的,因为似乎有点连贯。总之谢谢你!! 再一次,你在哪里设置BindingContext?没有它,绑定将无法工作。尝试在构造函数中添加BindingContext = this; 【参考方案1】:

目标对象的BindingContext属性必须设置为源对象。

如果你想在 xaml 中使用ItemsSource="Binding UserTasks,你应该在你的 page.cs 构造函数中添加BindingContext = this;,就像 Jason 上面所说的那样。

或者您可以在 xaml 中为您的 ListView 定义 x:Name,然后在您的 page.cs 中设置 ItemSource

<ListView x:Name="listview">
  ...
</ListView>


private async void GetTasks()
    
        using (var client = new HttpClient())
        
            string userId = "";
            if(Application.Current.Properties["userId"] != null)
            
                userId = Application.Current.Properties["userId"].ToString();
            
            var uri = "http://diplomaxmcws-dev.us-east-2.elasticbeanstalk.com/api/Tasks/GetUserTasks?userId=" + userId;
            var result = await client.GetStringAsync(uri);
            var TaskList = JsonConvert.DeserializeObject<List<XMCTasks>>(result);
            UserTasks = new ObservableCollection<XMCTasks>(TaskList);
            listview.ItemsSource = UserTasks;
        
    

【讨论】:

以上是关于将属性绑定到 Xamarin 中的 ListView,不会更新视图的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin Forms 将属性绑定到标签的文本

Xamarin 如何将类属性(来自另一个项目)绑定到 Picker.ItemDisplayBinding 属性

Xamarin 表单从 listview 绑定到 viewmodel

如何将ContentView绑定到属性?

如何将可观察集合绑定到 xamarin 中的 flexlayout?

Xamarin 绑定到列表视图项模板中的另一个元素