env*_*yM6 7 c# xaml xamarin xamarin.forms
我有一个 ListView 如下
<ListView
Grid.Row="0"
Margin="0"
x:Name="ItemsListView"
ItemsSource="{Binding SourceItems}"
VerticalOptions="FillAndExpand"
HasUnevenRows="false"
RefreshCommand="{Binding LoadItemsCommand}"
IsPullToRefreshEnabled="true"
IsRefreshing="{Binding IsBusy}"
ItemSelected="OnItemSelected"
IsVisible="{Binding ShowListView}"
RowHeight="55">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid
Margin="15,0,0,0"
Padding="0"
RowSpacing="0"
ColumnSpacing="0">
<Grid.RowDefinitions>
<RowDefinition
Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition
Width="1*" />
<ColumnDefinition
Width="7*" />
<ColumnDefinition
Width="1*" />
<ColumnDefinition
Width="1*" />
</Grid.ColumnDefinitions>
<Image
VerticalOptions="CenterAndExpand"
HorizontalOptions="CenterAndExpand"
HeightRequest="35"
WidthRequest="35"
Grid.Row="0"
Grid.Column="0"
Aspect="AspectFit"
Source="{Binding Icon}">
</Image>
<StackLayout
VerticalOptions="CenterAndExpand"
Spacing="0"
CompressedLayout.IsHeadless="true"
Margin="15,0,0,0"
Grid.Row="0"
Grid.Column="1">
<Label
VerticalTextAlignment="Start"
Text="{Binding Name}"
FontAttributes="Bold"
LineBreakMode="NoWrap"
Style="{DynamicResource ListItemTextStyle}"
FontSize="16" />
<Label
VerticalTextAlignment="Start"
Text="{Binding Description}"
LineBreakMode="NoWrap"
Style="{DynamicResource ListItemDetailTextStyle}"
FontSize="13" />
</StackLayout>
<Image
Grid.Row="0"
Grid.Column="3"
HeightRequest="20"
WidthRequest="20"
VerticalOptions="CenterAndExpand"
HorizontalOptions="StartAndExpand"
Aspect="AspectFit"
Source="{Binding Icon}" />
<Image
BackgroundColor="Lime"
Grid.Row="0"
Grid.Column="2"
InputTransparent="false"
Margin="0,0,10,0"
HeightRequest="20"
WidthRequest="20"
VerticalOptions="CenterAndExpand"
HorizontalOptions="StartAndExpand"
Aspect="AspectFit"
Source="ic_two">
<Image.GestureRecognizers>
<TapGestureRecognizer
Command="{Binding OnFavouriteCommand}"
CommandParameter="{Binding .}"
NumberOfTapsRequired="1">
</TapGestureRecognizer>
</Image.GestureRecognizers>
</Image>
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Run Code Online (Sandbox Code Playgroud)
在我的 ViewModel 我有
public ICommand OnFavouriteCommand { get; set; }
public MyViewModel()
{
OnFavouriteCommand = new Command<Object>(OnFavourite);
}
void OnFavourite(Object ob)
{
Debug.WriteLine(ob);
}
Run Code Online (Sandbox Code Playgroud)
我不Break Point
介意OnFavourite
。我不知道我在这里错过了什么?这个想法是在每个图像上附加一个手势识别器,并只传递绑定到该行的项目。
我刚刚注意到,如果我带
<Image
BackgroundColor="Lime"
Grid.Row="1"
InputTransparent="false"
Margin="0,0,10,0"
HeightRequest="20"
WidthRequest="20"
VerticalOptions="CenterAndExpand"
HorizontalOptions="StartAndExpand"
Aspect="AspectFit"
Source="ic_favourites">
<Image.GestureRecognizers>
<TapGestureRecognizer
Command="{Binding OnFavouriteCommand}"
CommandParameter="{Binding .}"
NumberOfTapsRequired="1">
</TapGestureRecognizer>
</Image.GestureRecognizers>
</Image>
Run Code Online (Sandbox Code Playgroud)
ListView
断点的外侧确实被击中了!。让我摸不着头脑... :|
要在列表视图中使用手势,请像这样使用
<Image
BackgroundColor="Lime"
Grid.Row="1"
InputTransparent="false"
Margin="0,0,10,0"
HeightRequest="20"
WidthRequest="20"
VerticalOptions="CenterAndExpand"
HorizontalOptions="StartAndExpand"
Aspect="AspectFit"
Source="ic_favourites">
<Image.GestureRecognizers>
<TapGestureRecognizer
Command="{Binding Binding Path=BindingContext.OnFavouriteCommand,Source={x:Reference root}}"
CommandParameter="{Binding .}"
NumberOfTapsRequired="1">
</TapGestureRecognizer>
</Image.GestureRecognizers>
</Image>
Run Code Online (Sandbox Code Playgroud)
这里 root 将是页面名称,如 set X:Name of your page is root like x:Name="root"
虽然 Adit 所写的是真实的,但让我为您提供一些背景知识。在 中DataTemplate
,BindingContext
单元格(以及它们的子元素)的 没有设置BindingContext
为父级(即ListView
)的 ,而是为您ListView.ItemSource
的单元格中的每个元素创建一个单元并将其BindingContext
设置为该元素。否则,你将无法给的属性绑定ViewCell
的孩子到你的领域,如Icon
,Name
,Description
,等。
在 WPF 中,可以绑定到父级DataContext
(参见此处),但 AFAIK 这在 Xamarin.Forms 中是不可能的(参见此处)。因此,您必须显式引用父级,即通过x:Name="Page"
(或您想给它的任何名称)分配一个名称,然后通过Source
绑定中的属性引用它
Command="{Binding Path=BindingContext.OnFavouriteCommand,Source={x:Reference Page}}"
Run Code Online (Sandbox Code Playgroud)
由于您设置的绑定源不是 the BindingContext
of Page
,而是 to Page
,因此您必须将 the 添加BindingContex
到路径中。此外,为了将由当前单元格表示的元素传递给命令,您必须设置
CommandParameter="{Binding .}"
Run Code Online (Sandbox Code Playgroud)
它绑定CommandParameter
到单元格引用的元素(您已经这样做了)。
归档时间: |
|
查看次数: |
2361 次 |
最近记录: |