Передать параметр из списка в конструктор viewmodel

#xaml #xamarin #mvvm #xamarin.forms #viewmodel

#xaml #xamarin #mvvm #xamarin.forms #viewmodel

Вопрос:

У меня есть список игроков

 public ObservableCollection<PlayerModel> Players { get; set; }
  

Для элементов с гибким описанием, которые можно привязать, установлено значение список игроков

 <FlexLayout x:Name="playerscollection" Wrap="Wrap" BindableLayout.ItemsSource="{Binding Players}"/>
  

Представление элементов представляет собой отдельный вид содержимого «PlayerView» с ViewModel «PlayerVieModel», который имеет параметризованный конструктор.

Просмотр проигрывателя =>

 <ContentView.Content>

        <StackLayout>


        <StackLayout  Orientation="Horizontal" HorizontalOptions="FillAndExpand" >

            <Entry x:Name="entry" Placeholder="الاسم" HorizontalOptions="FillAndExpand"  Text="{Binding PlayerName}" />
            <Label  TextColor="Black" FontSize="Medium" HorizontalOptions="End" Text="اللاعب" VerticalOptions="Center"/>
        </StackLayout>

        <views:SportsListView x:Name="sportsList" BindingContext="{Binding ListViewModel}"   
                                              HorizontalOptions="FillAndExpand"
                                              Pickervisibility="True"/>

        <Label x:Name="payment" Text="{Binding Source={x:Reference sportsList}, Path=BindingContext.SportsTotalPayments, StringFormat='{0:D2}'}" HorizontalTextAlignment="Start" Margin="0,0,10,0" Padding="0" VerticalTextAlignment="Center" HorizontalOptions="CenterAndExpand" FontSize="20"/>


    </StackLayout>

</ContentView.Content>

public PlayerViewModel(bool showPicker = true, PlayerModel player = null){}
  

Мне нужно привязать элементы просмотра списка к PlayerVieModel

 <FlexLayout x:Name="playerscollection" Wrap="Wrap" BindableLayout.ItemsSource="{Binding Players}">
    <BindableLayout.ItemTemplate>
        <DataTemplate>
            <views:PlayerView >
                <views:PlayerView.BindingContext>
                    <viewModels:PlayerViewModel>
                        <x:Arguments>
                                <x:Boolean>false</x:Boolean>
                                <models:PlayerModel/>
                            </x:Arguments>
                    </viewModels:PlayerViewModel>
                </views:PlayerView.BindingContext>
            </views:PlayerView>
        </DataTemplate>
    </BindableLayout.ItemTemplate>
</FlexLayout>
  

Но PlayerModel всегда равен нулю. Итак, я использовал привязку для модели

             <viewModels:PlayerViewModel>
                <x:Arguments>
                        <x:Boolean>false</x:Boolean>
                        <models:PlayerModel 
                            PlayerName="{Binding Source={x:Reference playerscollection},Path=PlayerName}" 
                            PlayerPayment="{Binding Source={x:Reference playerscollection},Path=PlayerPayment}" 
                            Sports="{Binding Source={x:Reference playerscollection},Path=Sports}" />
                    </x:Arguments>
            </viewModels:PlayerViewModel>
  

Выдает ошибку Missmatch x:аргумент

Комментарии:

1. views:PlayerView Содержит Listview ? Можете ли вы поделиться этой частью кода? Или playerscollection — это имя Listview .

2. Я добавил PlayerView XAML …. «playerscollection» относится к flexlayout listview

3. Почему бы не добавить BindingContext this.BindingContext = new MyPlayerViewModel(false, new PlayerModel() ); в свой фоновый код? Я добавляю ваш PlayerView код. затем я делаю тест с PlayerName в Entry . все работало как обычно. Вот скриншот запуска. imgur.com/a/3LBRxrb

4. Мне нужно передать каждый элемент в коллекции players в элементах flexlayout в Playerview

5. Привязка другого VIEWMOELНА вашей странице гибкого описания? Если это так, вы можете добавить BindingContext = new MyPlayerViewModel(false, new PlayerModel() ) непосредственно в PlayerView, когда вы добавите его на страницу гибкого описания, он будет у всех PlayerView .