我想将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;
}
答案 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
必须为BindableObject
。 BindingContext
是可绑定对象,它依次引用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)
两个步骤..
使用x:Name="viewName"
(绑定到ViewModel的视图)为您的父视图提供引用名称
按以下方式进行绑定:(WPF)
"{Binding DataContext.PropName, ElementName=viewName}"
对于Xamarin,请执行"{Binding BindingContext.PropName, ElementName=viewName}"