Xamarin Forms ListView Custom Cell 确定点击的列或控件
Xamarin Forms ListView Custom Cell determine clicked column or control
当我搜索这个时,我得到了很多点击,但我最终陷入了 WPF 特定的兔子洞或类似的东西。
我的环境是 Xamarin Forms Android、iOS 和 UWP。这是一个 experimental/educational 项目,因此对解决方案没有完全“硬”的要求。 ItemTappedEventArgs 为我提供了行的内容,但没有提供特定的项目或列。
如果用户点击 ListView ViewCell 中的特定项目,我如何确定他们点击了哪个特定列或控件?
这里是相关的XAML内容(RowStyle 只有 FontSize 和 Margin 等外观属性):
<ListView ItemsSource="{Binding CodeTable}" Margin="0, 0, 0, 0" SelectionMode="Single" ItemTapped="OnListViewItemTapped" x:Name="ListViewCodeTable" >
<ListView.ItemTemplate>
<DataTemplate x:DataType="models:CodeTableRow">
<ViewCell >
<Grid BackgroundColor="Khaki" VerticalOptions="Start" MinimumHeightRequest="10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Text ="{Binding Decimal}" Style="{StaticResource RowStyle}" />
<Label Grid.Column="1" Text ="{Binding Hex}" Style="{StaticResource RowStyle}" />
<Label Grid.Column="2" Text ="{Binding Ascii}" Style="{StaticResource RowStyle}" FontAttributes="{Binding AttribAscii}" />
etc.
您可以像这里一样使用 SelectedItem 来完成
<ListView x:Name="dataList" ItemsSource="{Binding routeLabels}"
HasUnevenRows="True" Grid.Row="1" Grid.Column="0"
Grid.ColumnSpan="3" SelectedItem="{Binding SelectedItem}">
</ListView>
在 ViewModel 中
private string _selectedItem;
public string SelectedItem {
get {return _selectedItem; }
set
{
_selectedItem = value;
// Additional code
}
}
使用 ItemTapped 你必须从 xaml.cs 页面处理它:
<ListView x:Name="dataList" ItemsSource="{Binding routeLabels}"
HasUnevenRows="True" Grid.Row="1" Grid.Column="0"
Grid.ColumnSpan="3" ItemSelected="Handle_ItemSelected" ItemTapped="MyItemTapped">
</ListView>
在后面的代码中
private async void MyItemTapped(object sender, ItemTapEventArgs e)
{
var content = e.Item as MyModel;
await Navigation.PushAsync(new somePage(content));
}
当我搜索这个时,我得到了很多点击,但我最终陷入了 WPF 特定的兔子洞或类似的东西。
我的环境是 Xamarin Forms Android、iOS 和 UWP。这是一个 experimental/educational 项目,因此对解决方案没有完全“硬”的要求。 ItemTappedEventArgs 为我提供了行的内容,但没有提供特定的项目或列。
如果用户点击 ListView ViewCell 中的特定项目,我如何确定他们点击了哪个特定列或控件?
这里是相关的XAML内容(RowStyle 只有 FontSize 和 Margin 等外观属性):
<ListView ItemsSource="{Binding CodeTable}" Margin="0, 0, 0, 0" SelectionMode="Single" ItemTapped="OnListViewItemTapped" x:Name="ListViewCodeTable" >
<ListView.ItemTemplate>
<DataTemplate x:DataType="models:CodeTableRow">
<ViewCell >
<Grid BackgroundColor="Khaki" VerticalOptions="Start" MinimumHeightRequest="10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Text ="{Binding Decimal}" Style="{StaticResource RowStyle}" />
<Label Grid.Column="1" Text ="{Binding Hex}" Style="{StaticResource RowStyle}" />
<Label Grid.Column="2" Text ="{Binding Ascii}" Style="{StaticResource RowStyle}" FontAttributes="{Binding AttribAscii}" />
etc.
您可以像这里一样使用 SelectedItem 来完成
<ListView x:Name="dataList" ItemsSource="{Binding routeLabels}"
HasUnevenRows="True" Grid.Row="1" Grid.Column="0"
Grid.ColumnSpan="3" SelectedItem="{Binding SelectedItem}">
</ListView>
在 ViewModel 中
private string _selectedItem;
public string SelectedItem {
get {return _selectedItem; }
set
{
_selectedItem = value;
// Additional code
}
}
使用 ItemTapped 你必须从 xaml.cs 页面处理它:
<ListView x:Name="dataList" ItemsSource="{Binding routeLabels}"
HasUnevenRows="True" Grid.Row="1" Grid.Column="0"
Grid.ColumnSpan="3" ItemSelected="Handle_ItemSelected" ItemTapped="MyItemTapped">
</ListView>
在后面的代码中
private async void MyItemTapped(object sender, ItemTapEventArgs e)
{
var content = e.Item as MyModel;
await Navigation.PushAsync(new somePage(content));
}