c# - 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 模式是双向的。
凯文
解决方案
我认为以这种方式编写您的设置器代码将解决您的问题
private NavigationItems _SelectedNavigationItem;
public NavigationItems SelectedNavigationItem
{
get { return _SelectedNavigationItem; }
set
{
if (_SelectedNavigationItem != value)
{
_SelectedNavigationItem = value;
NavigateToPage(value);
}
}
}
推荐阅读
- r - `renderDataTable` 和 `renderUI` 具有不同顺序的奇怪问题
- directshow - 为什么 SampleGrabber::SampleCB 只调用一次而不调用 SetSyncSource(NULL)
- c# - Picturebox按住鼠标按钮后更改图片并释放鼠标后重新更改C#
- r - 更改 jupyter notebook 主题以突出显示 R 功能
- javascript - 如何使用 Selenium 从页面滚动特定 div?
- android - 由于类型不匹配,无法在 Flow 中发出 Either.Left
- typescript - Vue 3 使用 v-model 作为 props 而不是 :prop 和 @emit
- javascript - 为什么在某些情况下“鼠标悬停”不能模拟悬停?
- java - 如何在 netbeans 12.4 中启用本机打包
- pine-script - 如何在松纸上玩弄 SMA 的时间框架?