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

时间:2019-06-27 15:58:04

标签: c# listview xamarin xamarin.forms binding

我想将ListView中的项目绑定到ViewModel中的属性而不是ItemsSource,但是尝试绑定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;
 }

3 个答案:

答案 0 :(得分:0)

我如下解决了

<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只是一个公共属性,不是Bindable对象BindingContext = ViewModel将其强制转换为Bindable对象,因此我不得不将这种方式用于Source和Text只需调用该引用的bindingcontext的路径

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:-1)

两个步骤..

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

  2. 按以下方式进行绑定:(WPF) "{Binding DataContext.PropName, ElementName=viewName}"

对于Xamarin,请执行"{Binding BindingContext.PropName, ElementName=viewName}"