Привязка выбранного элемента на сборщике не работает - PullRequest
0 голосов
/ 17 апреля 2020

У меня проблемы с установкой выбранного пункта в меню выбора. У меня есть List в моей viewModel, к которому я привязал ItemSource в представлении, и он прекрасно работает, я могу выбрать средство выбора и просмотреть свой список объектов, но я не могу установить индекс SelectedItem или SelectedItem, чтобы показать выбор по умолчанию. Другие данные, которые я связываю в моем представлении, прекрасно работают, когда я устанавливаю их в методе NavigatedTo (). Я также вхожу в сеттер для Facility, потому что моя writeLine записывается в консоли. Я успешно получаю sectedItem из списка, когда я добавляю его к своим параметрам в методе NavigateFrom () без каких-либо проблем, я просто не могу установить значение средства выбора. Также, если displayAlert не комментируется в нижней части метода NavigateTo (), я вижу, что Facility соответствует действительному объекту, поэтому я знаю, что он установлен правильно, но представление не хочет отображать его в средстве выбора?

    <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);
    }

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

SelectedItem должен быть ссылкой на элемент, который находится в вашем ItemsSource. Не копия объекта, ссылка на тот же объект. Тот факт, что вы запускаете новый MockDataStore () для получения Facility, заставляет меня думать, что они не являются идентичными ссылками

0 голосов
/ 18 апреля 2020

Вы не выделили _facility используя new. Это может быть причиной. Добавьте это в конструктор: _facility = new Facility ();

...