Значения Xamarin Forms Controls не видны - PullRequest
0 голосов
/ 03 мая 2018

Я создал страницу, которая передает значение на новую страницу, которая позволит пользователям обновлять данные. Когда пользователи выбирают запись для обновления, открывается форма редактирования, но данные не видны. Если значение изменено и нажата кнопка редактирования, оно обновит значение, но оно никогда не будет отображаться. Как я могу показать данные, которые должны быть отредактированы?

Просмотр модели

namespace QiApp.ViewModels
{
    public class EditTodayCasesViewModel
    {
        private SxCaseDataService _sxCaseDataService = new SxCaseDataService();

        public SxCase SelectedSxCase { get; set; }

        public ICommand EditSxCaseCommand => new Command(async () =>
            {
               await _sxCaseDataService.PutSxCase(SelectedSxCase.SxCaseId, SelectedSxCase);
            });
    }
}

Страница редактирования 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"
             xmlns:viewModels="clr-namespace:QiApp.ViewModels;assembly=QiApp.UWP"
             x:Class="QiApp.Views.EditTodayCasePage">
    <ContentPage.BindingContext>
        <viewModels:EditTodayCasesViewModel/>
    </ContentPage.BindingContext>

    <StackLayout>
        <Label Text="Surgery Case"/>
        <Label Text="{Binding SelectedSxCase.SxCaseId}"/>
        <Entry Text="{Binding SelectedSxCase.Record}"/>
        <Switch IsToggled="{Binding SelectedSxCase.Complete}"/>
        <Button Text="Edit Surgery Case"
                Command="{Binding EditSxCaseCommand}"/>
    </StackLayout>
</ContentPage>

Код позади

namespace QiApp.Views
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class EditTodayCasePage : ContentPage
    {


        public EditTodayCasePage(SxCase sxCase)
        {
            InitializeComponent();

            var editTodayCasesViewModel = BindingContext as EditTodayCasesViewModel;

            editTodayCasesViewModel.SelectedSxCase = sxCase;


        }
    }
}

1 Ответ

0 голосов
/ 03 мая 2018

Все в порядке, за исключением того, что ваше представление привязывается к модели представления, которая молчит при изменении свойств. Ваше представление не может получить никакой информации о том, когда оно должно обновлять себя и, следовательно, пользовательский интерфейс, как только свойство SelectedSxCase будет изменено.

К счастью, это можно сделать очень просто, просто внедрив общий интерфейс INotifyPropertyChanged и расширив связанные свойства с помощью строки кода, вызывающей событие, предоставляемое интерфейсом.

В основном это так ...

private SxCase _case;
public SxCase SelectedSxCase 
{ 
    get => _case; 
    set
    {
        _case = value;
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(SelectedSxCase)));
    }
}

... но есть несколько реализаций, которые делают это более элегантно, например , используя CallerMemberName или даже , автоматически переплетая геттер и сеттер с Fody .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...