首页 > 解决方案 > ListView 中的 Xamarin 表单命令绑定不起作用

问题描述

我正在尝试将命令绑定到 listView 内的按钮,但没有成功。我遵循此处发布的所有其他答案,例如: Xamarin Forms Button Command binding inside a ListView 实际结果是没有任何反应。我注意到的一件事是视觉工作室,当我输入后x:Reference建议我时GridWebcam,就像它没有看到其他参考元素一样。我能做些什么?

这是我的代码:

    <ContentPage 
             ...
             x:Name="WebcamList">
    <ContentPage.Resources>
        ...
    <ContentPage.Content>
        <ListView ItemsSource="{Binding ListOfWebcam}"
                  SeparatorVisibility="None"
                  CachingStrategy="RecycleElement"
                  RowHeight="250"
                  VerticalOptions="FillAndExpand"
                  x:Name="ListWebcam">

            <ListView.Header>
                <StackLayout x:Name="HeaderStackLayout"
                                   Padding="5,25,0,30"
                                   Orientation="Horizontal"
                                   HorizontalOptions="FillAndExpand">

                        <Label  x:Name="LabelHeader"
                                  Text="Webcam:"
                                  FontSize="Large"
                                  FontAttributes="Bold"
                                  TextColor="{x:Static statics:Palette.PrimaryColor}"
                                  VerticalOptions="Center"
                                  HorizontalOptions="Start" Margin="10,0,0,0"/>
                </StackLayout>
            </ListView.Header>

            <ListView.ItemTemplate>
                <DataTemplate>

                    <controls:ExtendedViewCell IsEnabled="False">
                        <controls:ExtendedViewCell.View>
                            <Grid x:Name="GridWebcam">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition Height="Auto"/>
                                </Grid.RowDefinitions>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="*"/>
                                </Grid.ColumnDefinitions>

                                <Frame Grid.Column="1"
                                       Grid.RowSpan="2"
                                       CornerRadius="20"
                                       BackgroundColor="{x:Static statics:Palette.PrimaryColor}"
                                       VerticalOptions="FillAndExpand"
                                       HorizontalOptions="FillAndExpand"
                                       HasShadow="True"
                                       Margin="5,10">

                                    <StackLayout>

                                        <Label Text="{Binding t_str_vid,Converter={StaticResource WebcamNameConverter}}"
                                               FontSize="Medium"
                                               TextColor="White"
                                               FontAttributes="Bold"
                                               HorizontalOptions="FillAndExpand"
                                               VerticalOptions="FillAndExpand">

                                        </Label>

                                        <Label TextColor="White"
                                               FontSize="Medium"
                                               Text="{Binding direzione,Converter={StaticResource DirectionToStringConverter}}"/>

                                        <StackLayout Orientation="Horizontal">
                                            <ffimageloading:CachedImage LoadingPlaceholder="Rolling.gif"
                                                                        DownsampleToViewSize="False"
                                                                        VerticalOptions="FillAndExpand"
                                                                        HorizontalOptions="StartAndExpand"
                                                                        Source="{Binding image1}"/>

                                            <iconize:IconButton Text="fas-play-circle"
                                                                FontSize="50"
                                                                HorizontalOptions="EndAndExpand"
                                                                VerticalOptions="EndAndExpand"
                                                                TextColor="White"
                                                                Command="{Binding BindingContext.OpenVideoWebcamCommand, Source={x:Reference WebcamList}}"
                                                                CommandParameter="{Binding .}"
                                                                BackgroundColor="Transparent"/>
                                        </StackLayout>
                                    </StackLayout>
                                </Frame>
                            </Grid>
                        </controls:ExtendedViewCell.View>
                    </controls:ExtendedViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </ContentPage.Content>
</ContentPage>
      ```
public class WebcamListViewModel : BaseViewModel
{
    public ICommand OpenVideoWebcamCommand { set; get; }

    private List<Webcam> _ListOfWebcam { get; set; }
    public List<Webcam> ListOfWebcam
    {
        get { return _ListOfWebcam; }
        set
        {
            _ListOfWebcam = value;
            OnPropertyChanged();
        }
    }

    private Task DownloadFramesTask;

    CancellationTokenSource tokenSourceDownloadFrames = new CancellationTokenSource();

    CancellationToken cancellationTokenDownloadFrames;

    public WebcamListViewModel(INavigationService navigationService, IApiAutostradeManagerFactory apiAutostradeManagerFactory) : base(navigationService,apiAutostradeManagerFactory)
    {

        OpenVideoWebcamCommand = new Command<Webcam>(async (webcam) => {
            await navigationService.NavigateAsync(Locator.WebcamVideoPopUpPage);
            Messenger.Default.Send(new InfoWebcamVideoMessage(webcam.c_mpr, webcam.c_uuid, webcam.t_str_vid));
        });     
}

标签: c#listviewmvvmxamarin.formsdata-binding

解决方案


那么它可能与controls:ExtendedViewCell你的这个神秘有关:)

您是否还禁用了 ListView 选择:<ListView ... SelectionMode="None" />


推荐阅读