【发布时间】:2021-05-24 05:37:27
【问题描述】:
我知道如何绑定事件,但我无法通过虚拟机进行热锻炼:
void TapGestureRecognizer_ElderList_Single(System.Object sender, System.EventArgs e)
{
var stacklayout = sender as StackLayout;
ListElders.SelectedItem = stacklayout.BindingContext;
ListElders.Focus();
}
我的理解是View知道ViewModel,而ViewModel不知道View。这向我表明,在这种情况下,在 Code Behind 中使用 Tapped 事件实际上是正确的例程。
是吗?不能从 ViewModel 中完成吗?
我想做什么?
如果我点击列表视图的左侧或右侧(在列表本身之外),则它会正确选择并显示为蓝色。这按预期工作。
但是,如果我单击列表中的项目本身,则默认情况下不会选择任何内容。所以我们从这个开始:
void TapGestureRecognizer_ElderList_Single(System.Object sender, System.EventArgs e)
{
var stacklayout = sender as StackLayout;
ListElders.SelectedItem = stacklayout.BindingContext;
//ListElders.Focus();
}
现在,当您选择或单击项目本身时,它会被选中。但是当我的窗口上有两个列表视图时,我发现选择并不总是显示为蓝色。它有时显示为深灰色。我认为这是因为列表视图没有焦点。
当我添加焦点调用时,它将始终显示蓝色。
目前已完成 XAMl:
<ListView
x:Name="ListElders"
HasUnevenRows="True"
HorizontalOptions="StartAndExpand"
ItemsSource="{Binding EldersCollection}"
SelectedItem="{Binding SelectedElder, Mode=TwoWay}"
VerticalOptions="StartAndExpand">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout Padding="2">
<Label
FontSize="Small"
Text="{Binding .}"
VerticalTextAlignment="Center" />
<StackLayout.GestureRecognizers>
<TapGestureRecognizer NumberOfTapsRequired="1" Tapped="TapGestureRecognizer_ElderList_Single" />
<TapGestureRecognizer
Command="{Binding Path=BindingContext.EditElderCommand, Source={Reference ListElders}}"
CommandParameter="{Binding Path=SelectedItem, Source={Reference ListElders}}"
NumberOfTapsRequired="2" />
</StackLayout.GestureRecognizers>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
【问题讨论】:
-
TapGestureRecognizers 有一个专门针对这种情况的 Command 属性
-
@Jason 那么我哪里出错了? SelectedElder 映射到 Selected 项,而我们在 ViewModel 中没有 ListView 项,所以无法调用 Focus。
-
这里没有多少上下文让我了解您要完成的工作或您面临的具体问题。如果您问“如何从 VM 操作 UI 对象?”那么将其作为 View 中的事件处理可能更有意义,而不是 VM。
标签: c# xaml xamarin.forms command