c # Prism соединение между двумя ViewModels - PullRequest
0 голосов
/ 27 июня 2018

Я разрабатываю приложение Xamarin Forms, которое использует Prism для MVVM, и у меня есть некоторые проблемы, точнее, в установлении соединения между двумя моделями представления.

В моей главной странице есть UserControl и метка (TextBlock), а в UserControl есть средство выбора (ComboBox).

Чего я хочу добиться, так это установить соединение между MainPageViewModels и UserControlViewModel, чтобы каждый раз, когда пользователь изменяет выбор в средстве выбора, UserControlViewModel сообщает затем MainPageViewModels, что он может изменять значение метки (TextBlock).

Вот мой код:

MainPage:

<?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:views="clr-namespace:MyNewApp.Views"
            xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
            prism:ViewModelLocator.AutowireViewModel="True"
            x:Class="MyNewApp.Views.MainPage">

    <ContentPage.Content>
        <StackLayout>

            <views:UserControl x:Name="UserControl"/>

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

        </StackLayout>
    </ContentPage.Content>

</ContentPage>

MainPageViewModel:

using Prism.Events;
using Prism.Mvvm;

namespace MyNewApp.ViewModels
{
    class MainPageViewModel : BindableBase
    {
        private int _NumberChosen;
        public int NumberChosen
        {
            get { return _NumberChosen; }
            set { SetProperty(ref _NumberChosen, value); }
        }

        public MainPageViewModel()
        {
            // Must Read the value on the picker of the UserControl.
            NumberChosen = 0;
        }
    }
}

UserControl:

<?xml version="1.0" encoding="utf-8" ?>
<Grid xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
             prism:ViewModelLocator.AutowireViewModel="True"
             x:Class="MyNewApp.Views.UserControl">

    <Grid.RowDefinitions>
        <RowDefinition Height="auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <Label Grid.Row="0" Text="Pick a number:"/>

    <Picker Grid.Row="1" 
            ItemsSource="{Binding NumericSource}"
            SelectedItem="{Binding NumberSelected}"
            />

</Grid>

UserControlViewModel

using Prism.Events;
using Prism.Mvvm;
using System.Collections.ObjectModel;

namespace MyNewApp.ViewModels
{
    public class UserControlViewModel : BindableBase
    {
        public ObservableCollection<int> NumericSource { get; set; }

        private int _NumberSelected;
        public int NumberSelected
        {
            get { return _NumberSelected; }
            set { SetProperty(ref _NumberSelected, value); }
        }

        public UserControlViewModel()
        {
            var source = SourceCreator();

            NumericSource = source;
            NumberSelected = source[0];
        }

        ObservableCollection<int> SourceCreator()
        {
            ObservableCollection<int> sourceCreator = new ObservableCollection<int>();
            for (int i = 21; i < 99; i++)
            {
                sourceCreator.Add(i);
            }
            return sourceCreator;
        }
    }
}

Ценю вашу помощь.

1 Ответ

0 голосов
/ 29 июня 2018

1 - Определить привязываемое свойство в UserControl под названием NumberChosen

2 - в пользовательском элементе управления Xaml, привязать NumberChosen к NumberSelected (SelectedItem вашего средства выбора) (вы также можете привязать его к SelectedItem вашего средства выбора)

https://www.c -sharpcorner.com / статьи / связывании контроля к контролю-в-Xamarin-форм /

3- Если вы хотите показать это только на главной странице, вы можете привязать элемент управления к элементу управления, как упоминалось ранее.

4 - Вы также можете привязать ChosenNumber пользовательского элемента управления к свойству в вашей модели основного вида тоже

...