Я разрабатываю приложение 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;
}
}
}
Ценю вашу помощь.