Несколько BindingContext на одной и той же ContentPage, два разных представления? - PullRequest
0 голосов
/ 12 мая 2018

У меня есть ContentPage с двумя ContentViews на нем, и я хочу установить контекст привязки для каждого из них на свой собственный соответствующий ViewModel (это мой предпочтительный вариант над одной массивной ViewModel для них вместе)

MainPage

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage x:Class="MVVMFramework.VVMs.Main.MainPage"
             xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:MVVMFramework"
             xmlns:nav="clr-namespace:MVVMFramework.Navigation.NavigationHeader"
             xmlns:vm="clr-namespace:MVVMFramework.VVMs.Main">
  <Grid>
    <Grid.RowDefinitions>
      <RowDefinition Height="20" />
      <RowDefinition Height="200" />
    </Grid.RowDefinitions>

    //ContentView For Header
    <ContentView Grid.Row="0"
                 HorizontalOptions="Start"
                 VerticalOptions="Start">
Content="{Binding NavHeader}"
      <!--<ContentView.BindingContext>
        <nav:NavigationHeaderViewModel />
      </ContentView.BindingContext>-->
    </ContentView>

    //ContentView For Body of the app
    <ContentView Grid.Row="1"
                 Content="{Binding DisplayedView}"
                 HorizontalOptions="Center"
                 VerticalOptions="Center">
      <!--<ContentView.BindingContext>
        <vm:MainPageViewModel />
      </ContentView.BindingContext>-->
    </ContentView>

  </Grid>


</ContentPage>

Когда я раскомментирую оба атрибута bindingcontext, приложение компилируется, запускается, а затем вылетает при загрузке MainPage.

Не правильно ли я это реализую?, Есть ли другой способ?сделать это?

1 Ответ

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

Ответ

Вы можете указать источник для привязки каждого представления, используя его свойство BindingContext, например:

BindingContext="{Binding Source = {Your Binding Source}}"

код

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage x:Class="MVVMFramework.VVMs.Main.MainPage"
             xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:MVVMFramework"
             xmlns:nav="clr-namespace:MVVMFramework.Navigation.NavigationHeader"
             xmlns:vm="clr-namespace:MVVMFramework.VVMs.Main">

    <Grid>
    <Grid.RowDefinitions>
      <RowDefinition Height="20" />
      <RowDefinition Height="200" />
    </Grid.RowDefinitions>


    <ContentView 
        Grid.Row="0"
        Content="{Binding NavHeader}"
        HorizontalOptions="Start"
        VerticalOptions="Start"
        BindingContext="{Binding Source = {nav:NavigationHeaderViewModel}}"/>

    <ContentView 
        Grid.Row="1"
        Content="{Binding DisplayedView}"
        HorizontalOptions="Center"
        VerticalOptions="Center"
        BindingContext="{Binding Source = {vm:MainPageViewModel}}"/>

  </Grid>

</ContentPage>

Пример приложения

Вот пример приложения, в котором показано, как ссылаться на несколько моделей представлений из одной и той же ContentPage: https://github.com/brminnick/MultipleViewModelSample/

...