我正在尝试在tap事件上打开新的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;
        }
    }
}

但是,DetailPageDetailViewModel之间的绑定似乎不起作用,该页面未显示任何内容。 id本身一直正确地一直传递到DetailViewModel

这是由于初始化的顺序吗?我想所有用XAML编写的内容都将在DetailPage.InitializeComponent()方法中执行吗?如果正确,在ViewModel之前实例化DetailPage.InitializeComponent()是否安全/正确?

任何提示表示赞赏。

最佳答案

您的trackID属性不是公开的。

注意:如果您观看应用程序日志输出,则可以捕获到这样的绑定问题(通过字符串Binding:对其进行过滤)

未绑定 private 变量的日志示例:

Binding: 'trackID' property not found on 'XXXX.VM', target property: 'Xamarin.Forms.Label.Text'

DetailViewModel修复:
public class DetailViewModel : BaseViewModel
{
    int _trackID;
    public int trackID;
    {
        get { return _trackID; }
        set
        {
            _trackID = value;
            notifyPropertyChanged(nameof(trackID));
        }
    }
    ~~~~
 }

10-08 02:46