Xamarin - получает значение из метки внутри ячейки, по которой щелкнули, - PullRequest
0 голосов
/ 19 марта 2020

У меня есть collectionView, который автоматически заполняется через источник Binding. В каждой ячейке у меня есть несколько ярлыков. Когда я нажимаю на Метку, мне нужно будет прочитать значение одной из этих меток .. (в приведенном ниже примере это «PhotographerCode»). Это то, что у меня есть, но я не могу понять, как чтобы получить доступ к метке из кода после запуска события ...

<StackLayout>
        <Button Text="Populate DB" 
                x:Name="populateButton" 
                Clicked="populateButton_Clicked"/>
        <CollectionView ItemsSource="{Binding GalleryList}">
            <CollectionView.ItemsLayout>
                <GridItemsLayout Orientation="Vertical"
                    Span="1" />
            </CollectionView.ItemsLayout>
            <CollectionView.ItemTemplate>
                <DataTemplate>
                    <ViewCell x:Name="Cell"  Tapped="Cell_Tapped">
                    <Grid Padding="10" ColumnSpacing="0" RowSpacing="0">


                        <Label Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3" Text="{Binding GalleryName}" FontSize="Large" BackgroundColor="LightGray"></Label>
                        <Label Grid.Row="1" Grid.Column="0" Text="Photographer: " FontSize="Small"  BackgroundColor="LightGray"></Label>
                        <Label Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2" Text="{Binding PhotographerName}" FontSize="Default" BackgroundColor="LightGray"></Label>
                        <Label Grid.Row="2" Grid.Column="0" Text="Code: " FontSize="Small" BackgroundColor="LightGray"></Label>
                        <Label x:Name="PhotographerCode" Grid.Row="2" Grid.Column="1" Text="{Binding PhotographerCode}" FontSize="Small" BackgroundColor="LightGray"></Label>
                        <Label Grid.Row="2" Grid.Column="2" Text="{Binding GalleryCode}" FontSize="Small" BackgroundColor="LightGray"></Label>
                    </Grid>
                    </ViewCell>
                </DataTemplate>
            </CollectionView.ItemTemplate>
        </CollectionView>
    </StackLayout>

и файла .cs:

 private void Cell_Tapped(object sender, EventArgs e)
    {
       ....
    }

Ответы [ 2 ]

1 голос
/ 19 марта 2020

CollectionView имеет встроенную поддержку для этого

<CollectionView ItemsSource="{Binding GalleryList}" SelectionMode="Single" SelectionChanged="OnCollectionViewSelectionChanged">

, тогда в вашем обработчике событий

void OnCollectionViewSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    var item = (MyModelClass)e.CurrentSelection.FirstOrDefault();

    ....
}

вам также не нужно (и не нужно) используйте любой из элементов * Cell с CollectionView. Они были необходимы для ListView и были заменены шаблонами c generic с CollectionView

0 голосов
/ 19 марта 2020

Кроме ответа Джейсона, я предлагаю вам также получить любой текст метки с помощью CollectionView SelectedItem .

Это мой код, связывающий SelectedItem, режим как TwoWay.

<StackLayout>

        <CollectionView
            ItemsSource="{Binding GalleryList}"
            SelectedItem="{Binding photo, Mode=TwoWay}"
            SelectionMode="Single">

            <CollectionView.ItemTemplate>
                <DataTemplate>

                    <Grid Margin="10" Padding="10">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="*" />
                            <RowDefinition Height="*" />
                            <RowDefinition Height="*" />
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*" />
                            <ColumnDefinition Width="*" />
                            <ColumnDefinition Width="*" />
                        </Grid.ColumnDefinitions>

                        <Label
                            Grid.Row="0"
                            Grid.Column="0"
                            Grid.ColumnSpan="3"
                            BackgroundColor="LightGray"
                            FontSize="Large"
                            Text="{Binding GalleryName}" />
                        <Label
                            Grid.Row="1"
                            Grid.Column="0"
                            BackgroundColor="LightGray"
                            FontSize="Small"
                            Text="Photographer: " />
                        <Label
                            Grid.Row="1"
                            Grid.Column="1"
                            Grid.ColumnSpan="2"
                            BackgroundColor="LightGray"
                            FontSize="Default"
                            Text="{Binding PhotographerName}" />
                        <Label
                            Grid.Row="2"
                            Grid.Column="0"
                            BackgroundColor="LightGray"
                            FontSize="Small"
                            Text="Code: " />
                        <Label
                            x:Name="PhotographerCode"
                            Grid.Row="2"
                            Grid.Column="1"
                            BackgroundColor="LightGray"
                            FontSize="Small"
                            Text="{Binding PhotographerCode}" />
                        <Label
                            Grid.Row="2"
                            Grid.Column="2"
                            BackgroundColor="LightGray"
                            FontSize="Small"
                            Text="{Binding GalleryCode}" />
                    </Grid>

                </DataTemplate>
            </CollectionView.ItemTemplate>
        </CollectionView>
    </StackLayout>

public partial class Page1 : ContentPage, INotifyPropertyChanged
{
    public ObservableCollection<photo> GalleryList { get; set; }
    private photo _selecteditem;
    public photo selecteditem
    {
        get { return _selecteditem; }
        set
        {
            _selecteditem = value;
            RaisePropertyChanged("selecteditem");
            Console.WriteLine("the selected GalleryName is {0}", selecteditem.GalleryName);

        }
    }
    public Page1()
    {
        InitializeComponent();

        GalleryList = new ObservableCollection<photo>()
        {
            new photo(){GalleryName="photo 1",PhotographerName="test 1",PhotographerCode="test",GalleryCode="test"},
            new photo(){GalleryName="photo 2",PhotographerName="test 2",PhotographerCode="test",GalleryCode="test"},
            new photo(){GalleryName="photo 3",PhotographerName="test 1",PhotographerCode="test",GalleryCode="test"},
            new photo(){GalleryName="photo 4",PhotographerName="test 2",PhotographerCode="test",GalleryCode="test"}
        };

        this.BindingContext = this;

    }      
    public event PropertyChangedEventHandler PropertyChanged;       
    public void RaisePropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }        
}

public class photo
{
    public string GalleryName { get; set; }
    public string PhotographerName { get; set; }
    public string PhotographerCode { get; set; }
    public string GalleryCode { get; set; }

}
...