首页 > 解决方案 > Xamarin 表单 - ListviewSelectedItem MVVM

问题描述

我无法在列表视图控件中设置 selectedItem。我已经设置了绑定上下文并且可以毫无问题地调试代码。表单的加载我可以看到调用了 get 和 set 方法,但是当我在列表视图中选择一个项目时,不会调用该集合。我不明白为什么

    private NavigationItems _SelectedNavigationItem;
    public NavigationItems SelectedNavigationItem
    {
        get { return _SelectedNavigationItem; }
        set
        {
            if (value != null)
            {
                _SelectedNavigationItem = value;
                NavigateToPage(value);   
            }
        }
    }

    public async void NavigateToPage(NavigationItems selectedItem )
    {
        switch (selectedItem.Id)
        {
            case "Appointments":
                await Navigation.PushAsync(new MyAppointments());
                break;
            case "Companies":
                await Navigation.PushAsync(new Companies());
                break;
            case "Messages":
                await Navigation.PushAsync(new Messages());
                break;
            default:              
                break;
        }
    }

看法

            <!-- Navigation -->
            <ListView Grid.ColumnSpan="2" Margin="20,30,20,10" Grid.Row="1"
                      ItemsSource="{Binding NavigationCollection}"
                      SelectedItem="{Binding SelectedNavigationItem}"
                      HasUnevenRows="false"                      
                      HorizontalOptions="FillAndExpand"
                      VerticalOptions="FillAndExpand">

                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell >

                                <Grid Padding="5,5,5,5" >
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="auto"/>
                                        <ColumnDefinition Width="*"/>
                                        <ColumnDefinition Width="*"/>
                                        <ColumnDefinition Width="auto"/>
                                    </Grid.ColumnDefinitions>

                                    <!--Icon-->
                                    <Image Aspect="AspectFit" Grid.Column="0" HeightRequest="18" WidthRequest="18"  Source="{Binding Icon}"/>

                                    <!--Navigation Name-->
                                    <Label Margin="10,0,30,0" Grid.Column="1" Grid.ColumnSpan="2" Style="{StaticResource SecondaryLabelStyle}" Text="{Binding Name}" FontSize="Medium"/>

                                    <!--Navigation Totals-->
                                    <Frame VerticalOptions="Center" Grid.Column="3" Style="{StaticResource CircleFrameStyle}">
                                        <Label TextColor="#d2d2d2"  HorizontalTextAlignment="Center" VerticalOptions="Center" Text="{Binding Total}" FontSize="Small">
                                            <Label.GestureRecognizers>
                                                <TapGestureRecognizer Command="{Binding ForgotPassword}" />
                                            </Label.GestureRecognizers>
                                        </Label>
                                    </Frame>

                                </Grid>

                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>

一切似乎都井然有序,但奇怪的事情正在发生。我还尝试在 xaml 中明确设置 mode=TwoWay 但我知道默认情况下 listview 模式是双向的。

凯文

标签: c#mvvmxamarin.forms

解决方案


我认为以这种方式编写您的设置器代码将解决您的问题

private NavigationItems _SelectedNavigationItem;
    public NavigationItems SelectedNavigationItem
    {
        get { return _SelectedNavigationItem; }
        set
        {
            if (_SelectedNavigationItem != value)
            {
                _SelectedNavigationItem = value;
                NavigateToPage(value);   
            }
        }
    }

推荐阅读