首页 > 解决方案 > 在选取器上绑定 SelectedItem 不起作用

问题描述

我在选择器菜单中设置所选项目时遇到问题。我的 viewModel 中有一个列表,我将 ItemSource 绑定到视图中,效果很好,我可以选择选择器并查看我的设施列表,但我无法设置 SelectedItem 或 SelectedItem 索引以显示默认选择。当我在 NavigatedTo() 方法中设置它们时,我在视图中绑定的其他数据工作得很好。我也进入了 Facility 的设置器,因为我的 writeLine 是在控制台中编写的。当我将 sectedItem 添加到 NavigateFrom() 方法中的参数中时,我成功地将 sectedItem 从列表中取出,没有任何问题,我似乎无法设置选择器的值。此外,如果 displayAlert 在 NavigateTo() 方法的底部未注释,

    <Grid Grid.Row="3" Grid.ColumnSpan="2" Padding="15">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
            <Label Text="Facility:"  VerticalTextAlignment="Center"/>
            <Picker Grid.Column="1" ItemsSource="{Binding FacilityList}" 
                    ItemDisplayBinding="{Binding Name}" SelectedItem="{Binding Facility, Mode=TwoWay" />
    </Grid>
public class CallInfoPageViewModel : ViewModelBase, INavigationAware
    {
        private Facility _facility;
        public Facility Facility
        {
            get { return _facility; }
            set
            {
                Console.WriteLine("\n**************\n we hit the thing!\n************");
                SetProperty(ref _facility, value);
            }
        }

        public List<Facility> FacilityList { get; set; }

        private readonly INavigationService _navigationService;
        private DelegateCommand _showHelpPageCommand;
        public DelegateCommand ShowHelpPageCommand =>
            _showHelpPageCommand ?? (_showHelpPageCommand = new DelegateCommand(ExecuteShowHelpPageCommand));


        public CallInfoPageViewModel(INavigationService navigationService)
        {
            Title = "Call Information";
            _navigationService = navigationService;

            FacilityList = new MockDataStore().GetFacilityList();

            CallDate = SpillDate = DateTime.Now.Date;
            CallTime = DateTime.Now.TimeOfDay;
            SpillTime = CallTime.Subtract(TimeSpan.FromHours(1));
        }

        async void ExecuteShowHelpPageCommand()
        {
            await _navigationService.NavigateAsync("CallInfoHelpPage");
        }

        // called when leaving this view/viewModel
        public async void OnNavigatedFrom(INavigationParameters parameters)
        {
            if (CallerName != null)
            {
                parameters.Add("callerName", CallerName);
            }

            if (UserName != null)
            {
                parameters.Add("userName", UserName);
            }

            if (Facility != null)
            {
                parameters.Add("facility", Facility);
            }

            parameters.Add("callDate", CallDate);
            parameters.Add("callTime", CallTime);
            parameters.Add("spillDate", SpillDate);
            parameters.Add("spillTime", SpillTime);
            parameters.Add("spillStillOngoing", SpillStillOngoing);
            parameters.Add("spillContainedOnSite", SpillContainedOnSite);
            parameters.Add("needAssistance", NeedAssistance);
        }

        // called when everything created/ initialised and page added to navigation stack
        public async void OnNavigatedTo(INavigationParameters parameters)
        {

            if (parameters.ContainsKey("demoMode") || parameters.ContainsKey("callInfoPageComplete"))
            {
                UserName = parameters.GetValue<string>("userName");
                CallerName = parameters.GetValue<string>("callerName");
                SpillDate = parameters.GetValue<DateTime>("spillDate");
                CallDate = parameters.GetValue<DateTime>("callDate");
                SpillTime = parameters.GetValue<TimeSpan>("spillTime");
                CallTime = parameters.GetValue<TimeSpan>("callTime");
                Facility = parameters.GetValue<Facility>("facility");
                SpillStillOngoing = parameters.GetValue<bool>("spillOngoing");
                SpillContainedOnSite = parameters.GetValue<bool>("spillContainedOnSite");
                NeedAssistance = parameters.GetValue<bool>("needAssistance");
            }

            //await Application.Current.MainPage.DisplayAlert("params",
            //    "Facilty " + Facility + "\n name: " + Facility.Name + "\naddr: " + Facility.Address,
            //    "OK");
        }
    }
async void ExecuteLoadDemoCommand()
    {
        loadDemoBool = true;
        report.CallerName = "Stephan Kemper";
        report.UserName = "Tyler Bartlett";
        report.SpillDate = new DateTime(2019, 12, 10);
        report.CallDate = new DateTime(2019, 12, 10);
        report.SpillTime = new TimeSpan(13, 0, 0);
        report.CallTime = new TimeSpan(14, 0, 0);
        report.Facility = new MockDataStore().GetFacility("Millersburg - Main");
        report.SpillStillOngoing = false;
        report.SpillContainedOnSite = true;
        report.NeedAssistance = false;
    }
public Facility GetFacility(string facilityName)
    {
        return facilities.Find(facility => facility.Name == facilityName);
    }

标签: c#xamarinmvvmdata-bindingprism

解决方案


SelectedItem 必须是对 ItemsSource 中项目的引用。不是对象的副本,而是对同一对象的引用。您启动一个新的 MockDataStore() 来获取 Facility 的事实让我认为它们不是相同的引用


推荐阅读