【问题标题】:Xamarin forms picker data bindingXamarin 表单选择器数据绑定
【发布时间】:2018-09-19 04:41:12
【问题描述】:

我有一个 Xamarin 项目,其中包含一个页面,其中包含有关手术病例的详细信息。我添加了一个选择器,用于选择可以链接到手术病例的眼睛列表。选择器只显示对象,而不是列表中的数据。我究竟做错了什么? 这是代码

<?xml version="1.0" encoding="utf-8" ?>
<forms:ContentPage
    x:Class="SxQiApp.EditSxCasePage"
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:forms="clr-namespace:Xamarin.Forms;assembly=Xamarin.Forms.Core"
    xmlns:viewModels="clr-namespace:SxQiApp.ViewModels;assembly=SxQiApp">

    <forms:ContentPage.BindingContext>
        <viewModels:SxCaseViewModel />
    </forms:ContentPage.BindingContext>

    <forms:StackLayout>
        <Label Text="Record" />
        <Entry Text="{Binding SelectedSxCase.Record}" />
        <Label Text="Case" />
        <Entry Text="{Binding SelectedSxCase.Facesheet}" />
        <Label Text="Return OR" />
        <Switch IsToggled="{Binding SelectedSxCase.ReturnOr}" />
        <Label Text="Complication" />
        <Switch IsToggled="{Binding SelectedSxCase.Complication}" />

        <Picker Title="Eye" ItemsSource="{Binding Eyes}" ItemDisplayBinding="{Binding Eyes}" /> 
        <Label Text="{Binding SelectedEye}" />
        <Button Command="{Binding PutSxCaseCommand}" Text="Edit Case" />
        <Button Command="{Binding DeleteSxCaseCommand}" Text="Delete Case" />
    </forms:StackLayout>

</forms:ContentPage>

这是背后的代码

using SxQiApp.ViewModels;
using Xamarin.Forms;

namespace SxQiApp
{
    // XamlC is set in App.xaml.cs
    //[XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class EditSxCasePage : ContentPage
    {
        public EditSxCasePage()
        {
            InitializeComponent();

        }

        public EditSxCasePage(SxCaseViewModel SxCaseViewModel)
        {
            InitializeComponent();

            this.SxCaseViewModel = SxCaseViewModel;
            BindingContext = SxCaseViewModel;



        }

        public SxCaseViewModel SxCaseViewModel { get; }

    }
}

这是视图模型

using SxQiApp.Models;
using SxQiApp.Services;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
using System.Windows.Input;
using Xamarin.Forms;

namespace SxQiApp.ViewModels
{
    public class SxCaseViewModel : INotifyPropertyChanged
    {
        private List<SxCase> _sxcase;
        private SxCaseDataService _sxCaseDataService = new SxCaseDataService();
        private SxCase _selectedSxCase;
        private List<Eye> _eye;
        private EyeDataService _eyeDataService = new EyeDataService();
        private Eye _selectedEye;



        public SxCase SelectedSxCase
        {
            get { return _selectedSxCase; }
            set
            {
                _selectedSxCase = value;
                OnPropertyChanged();
            }
        }


        public List<SxCase> SxCases
        {
            get
            {
                return _sxcase;

            }
            set
            {
                _sxcase = value;
                OnPropertyChanged();
            }
        }

        public Command PutSxCaseCommand
        {
            get
            {
                return new Command(async () =>
                {
                    var sxCaseDataService = new SxCaseDataService();
                    await sxCaseDataService.PutSxCase(_selectedSxCase.SxCaseId, _selectedSxCase);
                });
            }
        }

        public Command DeleteSxCaseCommand
        {
            get
            {
                return new Command(async () =>
                {
                    var sxCaseDataService = new SxCaseDataService();
                    await sxCaseDataService.DeleteSxCaseAsync(_selectedSxCase.SxCaseId);
                });
            }
        }


        public ICommand AddRecordCommand => new Command(async () =>
        {

            await _sxCaseDataService.PostSxCase(SelectedSxCase);


        });



        public SxCaseViewModel()
        {


            SelectedSxCase = new SxCase();
            GetSxCases();

            SelectedEye = new Eye();
            GetEyes();
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged([CallerMemberName]string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        private async Task GetSxCases()
        {


            SxCases = await _sxCaseDataService.GetSxCases();
        }

        public Eye SelectedEye
        {
            get { return _selectedEye; }
            set
            {
                _selectedEye = value;
                OnPropertyChanged();
            }
        }


        public List<Eye> Eyes
        {
            get
            {
                return _eye;

            }
            set
            {
                _eye = value;
                OnPropertyChanged();
            }

        }

        private async Task GetEyes()
        {


            Eyes = await _eyeDataService.GetEyes();
        }


    }



}

【问题讨论】:

    标签: c# xamarin.forms


    【解决方案1】:

    你的绑定是对象:

    <Picker Title="Eye" ItemsSource="{Binding Eyes}" ItemDisplayBinding="{Binding Eyes}" />
    
    public List<Eye> Eyes {get;set;}
    

    如果要显示Eye 的某些属性,则需要绑定到它:

    (这将绑定到Eye 对象的.Name 属性)。

    https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/picker/populating-itemssource`

    【讨论】:

    • 我将 ItemDisplayBinding 更改为 {Binding Eye1} 并且效果很好。感谢您的帮助。
    猜你喜欢
    • 2018-02-01
    • 2021-04-18
    • 2020-01-15
    • 2020-05-22
    • 2016-08-27
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多