如何将listview项绑定绑定到页面的Viewmodel?

Posted

技术标签:

【中文标题】如何将listview项绑定绑定到页面的Viewmodel?【英文标题】:How to bind listview item binding to Viewmodel of the page? 【发布时间】:2019-11-09 16:47:26 【问题描述】:

我想将ListView 中的项目绑定到 ViewModel 而不是 ItemsSource 中的属性,但在尝试Binding Source=x:Reference Name=ThisPage Path=ViewModel.TimerValue 之后它不起作用。我做错了什么。无法识别

我试过设置:

Text="Binding Path=TimerValue, TargetNullValue='00:00', FallbackValue='00:00', StringFormat='0:mm\\:ss', Source=x:Reference Name=ThisPage"

ViewModel 确实实现了 INotifyPropertyChanged 并引发 PropertyChanged 事件

页眉 - 参考

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             x:Class="App3.Views.MyPage"
             x:Name="ThisPage">
<ListView x:Name="listView" ItemsSource=Binding Items>
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell>
                            <Label Text="Binding Path=TimerValue, TargetNullValue='00:00', FallbackValue='00:00', StringFormat='0:mm\\:ss', Source=x:Reference Name=ThisPage" />
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>

后面的代码

 private MyViewModel ViewModel;
 public MyPage () 
     InitializeComponent ();
     ViewModel = new MyViewModel ();
     this.BindingContext = ViewModel;
 

【问题讨论】:

您希望列表中的每个项目都显示相同的值吗? 您在哪里/如何设置 xaml 的绑定上下文? @Jason 是的。我会根据一些事件不断改变它 @haldo 抱歉,在这里错过了该声明。 this.BindingContext = ViewModel; 如果我没记错的话,该属性需要是公共的而不是私有的。您是否尝试过将private MyViewModel ViewModel 设为公开而不是私有? 【参考方案1】:

我解决了如下

<Label Text="Binding TimerValue, TargetNullValue='00:00', FallbackValue='00:00', StringFormat='0:mm\\:ss'"
        BindingContext="Binding Source=x:Reference MyPage, Path=BindingContext">

原因绑定错误,BindingContext 必须是 BindableObjectBindingContext 是可绑定对象,它又引用了ViewModel 对象,而Label.Text 必须是可绑定对象的BindableProperty。 当我引用Text=Binding ViewModel.TimerValue 时,它试图在Mypage 中找到可绑定属性,但是ViewModel 只是一个公共属性,而不是可绑定对象BindingContext = ViewModel 将其转换为可绑定对象,因此我不得不对 Source 和 Text 使用这种方式调用引用的绑定上下文的路径

感谢所有建议!非常感谢这个社区的及时响应!

【讨论】:

【参考方案2】:

迟到的答案,但可能会帮助某人。 如果您在后面的代码中编写布局。您可以以这种方式将上下文绑定到源视图模型上下文。我正在将按钮绑定到视图模型中的命令。

btn.SetBinding(Button.CommandProperty, new Binding("BindingContext.YourCommand", source: YourListView));
btn.SetBinding(Button.CommandParameterProperty, ".");

【讨论】:

【参考方案3】:

两步..

    使用x:Name="viewName"(绑定到 ViewModel 的视图)为您的父视图提供参考名称

    绑定如下: "Binding BindingContext.MenuTapCommand, Source=x:Reference viewName"

这行得通。

【讨论】:

有人愿意解释为什么这会被否决吗?

以上是关于如何将listview项绑定绑定到页面的Viewmodel?的主要内容,如果未能解决你的问题,请参考以下文章

从视图模型绑定到 ListView 项目的点击属性

如何将 ListView 绑定到集合并实时刷新

如何绑定listView中项的子属性?

如何绑定 Clicked 事件和 Command,使 Command 优先执行?

绑定:未找到属性。 MVVM

如何使用 TwoWay 模式将 Listview SelectedItem 绑定到文本框?