Передача настроек привязки данных Xamarin - PullRequest
0 голосов
/ 06 июля 2019

У меня есть CollectionView объектов класса и кнопка, которая получает SelectedItem и открывает ClassInfoPage. Мне было интересно, если есть способ применить тот же обязательный контекст SelectedItem к ClassInfoPage. Моя цель состоит в том, чтобы ClassInfoPage использовал тот же объект Class, что и SelectedItem, без необходимости извлекать объект из SelectedItem, изменять его в ClassInfoPage и помещать обратно в его ObservableCollection. Заранее спасибо

CollectionView xaml

<CollectionView ItemsSource="{Binding Classes}" x:Name="ClassesCollectionView" SelectionMode="Single" HeightRequest="0">
                <CollectionView.ItemTemplate>
                    <DataTemplate>
                        <FlexLayout Direction="Row" AlignItems="Center" JustifyContent="SpaceEvenly" HeightRequest="35">
                            <Label Text="{Binding ClassName}" FontSize="Micro" />
                            <Label Text="{Binding ClassStatus}" FontSize="Micro"/>
                            <DatePicker Date="{Binding ClassStartDate}" FontSize="Micro"/>
                            <DatePicker Date="{Binding ClassEndDate}" FontSize="Micro"/>
                        </FlexLayout>
                    </DataTemplate>
                </CollectionView.ItemTemplate>
            </CollectionView>

мой код в событии щелчка ClassInfoButton

private async void ClassInfoButton_OnClicked(object sender, EventArgs e)
        {

            FlexLayout selectedClass = ClassesCollectionView.SelectedItem as FlexLayout;
            await Navigation.PushAsync(new ClassInfoPage());
        }

ClassInfoPage.xaml

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="TermManager.ClassInfoPage">
    <ContentPage.Content>
        <StackLayout>
            <FlexLayout AlignItems="Center" Direction="Row" JustifyContent="SpaceBetween">
            <DatePicker Date="{Binding ClassStartDate}"/>
            <Editor Text="{Binding ClassName}"/>
            <DatePicker Date="{Binding ClassEndDate}"/>
        </FlexLayout>
            <Editor Text="{Binding ClassNotes}"/>
            <Editor Text="{Binding ClassTeacherName}"/>
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

1 Ответ

0 голосов
/ 06 июля 2019

вам нужно разыграть SelectedItem как MyClass (что бы это ни было), а не FlexLayout, а затем передать его ClassInfoPage

private async void ClassInfoButton_OnClicked(object sender, EventArgs e)
{
    MyClass selectedClass = ClassesCollectionView.SelectedItem as MyClass;
    await Navigation.PushAsync(new ClassInfoPage(selectedClass));
}

затем в ClassInfoPage

public ClassInfoPage(MyClass data) 
{
  this.BindingContext = data;
}

C # объекты передаются по ссылке, поэтому любые изменения, которые вы вносите в объект в ClassInfoPage, должны быть отражены на вашей первой странице, хотя вам может потребоваться обновить ваш пользовательский интерфейс (или использовать INotifyPropertyChanged), чтобы увидеть его

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