Привязка не работает, когда мы используем ListView с DataTemplate через ресурсы. (MVVM) - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть ListView, который получает ItemTemplate из файла ресурсов.

У меня есть словарь ресурсов, как показано ниже!

<?xml version="1.0" encoding="utf-8" ?>
<ResourceDictionary xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:ffimageloading="clr-namespace:FFImageLoading.Forms;assembly=FFImageLoading.Forms"
         xmlns:common="clr-namespace:xx.Common;assembly=xx"
         x:Class="xx.ResourceDictionaries.BaseHomeStyles"> 

 <DataTemplate x:Key="ListItemTemplate">
    <ViewCell>
        <Grid Padding="{StaticResource ListPadding}">
            <Grid.RowDefinitions>
                <RowDefinition Height="1.5*"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <ffimageloading:CachedImage Grid.Row="0" Aspect="Fill" DownsampleToViewSize="True" BitmapOptimizations="True"
                                            ErrorPlaceholder = "nopreviewlandscape" LoadingPlaceholder = "loadingicon" Source="{Binding TripImage}" />
            <StackLayout Grid.Row="1">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="4*"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
                    <Label Grid.Column="0" Text="{Binding TripName}" FontAttributes="Bold" TextColor="{StaticResource PrimaryColor}" />
                    <Image Grid.Column="1" Source="downarrow" Rotation="-90" BackgroundColor="{Binding PrimaryColor}"/>
                </Grid>
                <Label Text="{Binding ReferenceNumber}" FontAttributes="Bold"/>
                <Label Text="{Binding TripUIStartDate}" />
                <Label Text="{Binding DaysDetails}" TextColor="{StaticResource AppQuaternaryBackground}" />
            </StackLayout>
            <!--<Grid.GestureRecognizers>
                    <TapGestureRecognizer Command="{Binding Path=BindingContext.ToItineraryCommand, Source={x:Reference HomeList}}" CommandParameter="{Binding .}"/>
                </Grid.GestureRecognizers>-->
        </Grid>
    </ViewCell>
</DataTemplate>
</ResourceDictionary>

Затем я использую это DataTemplateкак ItemTemplate что-то вроде этого:

<ListView HasUnevenRows = "true" ItemsSource="{Binding CurrentTripInfo}" BackgroundColor="Transparent"
       CachingStrategy="RecycleElement" x:Name="HomeList" SeparatorVisibility ="Default" Grid.Row="1" ItemTemplate="{StaticResource ListItemTemplate}" />

Я добавляю этот ResourceDictionary примерно так:

 <ContentPage.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <resources:BaseHomeStyles/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</ContentPage.Resources>

Теперь я пытаюсь сделать здесь установку Click Command в моем ViewModel, Обычно, как я это сделал, устанавливая имя на ListView, как у меня в приведенном выше примере, а затем использую это имя, чтобы получить BindingContext списка, а затем используйте это, чтобы установить команду наэто, но когда я пытаюсь использовать это сейчас, он генерирует исключение синтаксического анализатора XML:

Xamarin.Forms.Xaml.XamlParseException: позиция 38:43.Не могу найти объект, на который ссылается HomeList

Теперь у меня есть два вопроса:

1- Как правильно установить команду для ListView, когда это делается выше?способ?

2- Если в будущем я планирую переместить это в App.XAML (если используется несколько раз), как я могу установить команду для него тогда?

1 Ответ

2 голосов
/ 22 апреля 2019

Извините за вводящую в заблуждение ссылку, я только что понял вашу проблему.

Вы можете использовать Поведение ListView для решения вашей проблемы, это настолько сложно и проще для чтения, чем связать команду в коде.

Вы можете перейти по ссылке ниже, чтобы увидеть, как это делается, а позже сделать это лучше, просто преобразовав все поведения в одно и передав ему имя события, ища событие с GetRuntimeEvent(eventName) и * 1006.* на объекте, который возвращает последний метод.

В конце ваш список будет выглядеть примерно так:

<ListView HasUnevenRows = "true" ItemsSource="{Binding CurrentTripInfo}" BackgroundColor="Transparent"
       CachingStrategy="RecycleElement" x:Name="HomeList" SeparatorVisibility ="Default" Grid.Row="1" ItemTemplate="{StaticResource ListItemTemplate}" >
    <ListView.Behaviors>
        <behaviors:EventToCommand EventName="ItemTapped" Command="{Binding ClickCommand}"/>
    </ListView.Behaviors>
</ListView>

https://devblogs.microsoft.com/xamarin/turn-events-into-commands-behaviors/

...