我正在尝试在点击事件中打开一个新的Page
,该事件应该显示有关某个对象的一些详细信息。为此,我需要将对象本身或其ID传递到新页面。因此,我向详细信息页面的构造函数添加了一个参数,如下所示。
void onItemTapped(object sender, ItemTappedEventArgs e)
{
if (e.Item != null)
{
bool convOk = Int32.TryParse((string)e.Item, out int id);
if (convOk)
{
Navigation.PushAsync(new DetailPage(id));
}
}
}
DetailPage
有自己的DetailViewModel
,在后面的代码中将其设置为BindingContext
。
DetailPage
XAML:
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Foo.Views.DetailPage">
<ContentPage.Content>
<StackLayout Orientation="Vertical">
<Label Text="FooBar" />
<Label Text="{Binding trackID}" />
</StackLayout>
</ContentPage.Content>
</ContentPage>
DetailPage
隐藏代码
namespace Foo.Views
{
public partial class DetailPage : ContentPage
{
public DetailPage(int trackID)
{
InitializeComponent();
BindingContext = new DetailViewModel(trackID);
}
}
}
DetailViewModel
:
namespace Foo.ViewModels
{
public class DetailViewModel : BaseViewModel
{
// trackID prop
int _trackID;
int trackID
{
get { return _trackID; }
set
{
_trackID = value;
notifyPropertyChanged(nameof(trackID));
}
}
public TargetDetailViewModel(int tid)
{
trackID = tid;
}
}
}
但是,DetailPage
和DetailViewModel
之间的绑定似乎无效,该页面未显示任何内容。 id本身一直正确地一直传递到DetailViewModel
。
这是由于初始化的顺序吗?我假设用XAML编写的所有内容都将在DetailPage.InitializeComponent()
方法中执行?如果正确,在ViewModel
之前实例化DetailPage.InitializeComponent()
是否安全/正确?
任何提示表示赞赏。
答案 0 :(得分:1)
您的trackID
属性不是公开的。
注意:如果您观看应用程序日志输出,则可以捕获这样的绑定问题(通过字符串Binding:
进行过滤)
Binding: 'trackID' property not found on 'XXXX.VM', target property: 'Xamarin.Forms.Label.Text'
public class DetailViewModel : BaseViewModel
{
int _trackID;
public int trackID;
{
get { return _trackID; }
set
{
_trackID = value;
notifyPropertyChanged(nameof(trackID));
}
}
~~~~
}