Как связать контекст со страницы с вкладками с другими страницами из кода CS в Xamarin? - PullRequest
0 голосов
/ 24 января 2020

У меня есть ListView, и когда Item открывает ItemTapped View Compose на 3 разных страницах, я хочу получить на этих страницах объект, который я предварительно нажал в ListView, чтобы показать его в текстовой метке.


Конечно! Это мой Xaml-контейнер с вкладками

<TabbedPage.Children>
    <views:Page1>
        <views:Page1.BindingContext>
            <viewModels:MainViewModel/>
        </views:Page1.BindingContext>
    </views:Page1>
    <views:Page2>
        <views:Page2.BindingContext>
            <viewModels:MainViewModel/>
        </views:Page2.BindingContext>
    </views:Page2>
</TabbedPage.Children>

Это мой MainViewModel

public class MainViewModel : INotifyPropertyChanged
{
    private string _selectedProduct;
    private string _purchasedProducts = "You purchased: ";

    public List<string> Products => new List<string>
    {
        "Computer", "Smartphone", "Tablet", "Keyboard", "Mouse", "Screen", "Headset"
    };

    public string SelectedProduct
    {
        get { return _selectedProduct; }
        set
        {
            _selectedProduct = value;
            OnPropertyChanged();
        }
    }

    public string PurchasedProducts
    {
        get { return _purchasedProducts; }
        set

        {
            _purchasedProducts = value;
            OnPropertyChanged();
        }
    }


    public ICommand SelectCommand => new Command(() =>
    {
        PurchasedProducts += SelectedProduct + ", ";
        Application.Current.MainPage.Navigation.PushModalAsync(new ContainerPage());
    });

    public event PropertyChangedEventHandler PropertyChanged;

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

Моя главная страница, где у меня есть ListView

<ContentPage.BindingContext>
    <local:MainViewModel />
</ContentPage.BindingContext>
<StackLayout Orientation="Vertical" Padding="40" Spacing="40">
    <Label Text="{Binding PurchasedProducts}" />
    <ListView ItemsSource="{Binding Products}" SelectedItem="{Binding SelectedProduct}">
        <ListView.Behaviors>
                <local:ItemSelectedToCommandBehavior Command="{Binding SelectCommand}" />
            </ListView.Behaviors>
        </ListView>
</StackLayout>

И, наконец, моя страница Page1 содержится в TabbedPage, где я хочу получить ViewModel Data

 <ContentPage.Content>
      <StackLayout>
            <Label Text="{Binding PurchasedProducts}" />
      </StackLayout>
    </ContentPage.Content>

Когда я запускаю проект с помощью инструмента отладки, я вижу, что в Page1

<Label Text="{Binding PurchasedProducts}" /> 

я получаю выбранное значение, но затем когда код выполняется

Command.Execute(null); 

, он стирает это значение из

<Label Text="{Binding PurchasedProducts}" />

1 Ответ

1 голос
/ 24 января 2020

После MVVM у вас должна быть страница-модель с вкладками, которая получает ссылку на выбранный вами элемент, а затем эта страница-модель с вкладками должна иметь привязку к своим 3 дочерним моделям представления (3 вкладки с вкладками). страница), где он может каким-то образом передать ссылку на этот элемент своим дочерним элементам, например, через конструктор или свойство.

TabbedView <=BindingContext= TabbedViewModel
    |                              |
    |                    selected item reference
    |                              \/
ChildView  <=BindingContext=  ChildViewModel

для ссылок на привязку данных: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/xaml/xaml-basics/data-binding-basics

для примеров связывания с вкладками: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/navigation/tabbed-page

...