我想避免在下面重复Source={RelativeSource AncestorType={x:Type vm:MainViewModel}}
。
<SwipeView ... xmlns:vm="clr-namespace:Todo.ViewModel">
<SwipeView.LeftItems>
<SwipeItems>
<SwipeItem Text="Delete"
Command="{Binding DeleteCommand,Source={RelativeSource AncestorType={x:Type vm:MainViewModel}}}" />
</SwipeItems>
</SwipeView.LeftItems>
<Grid Padding="0,5">
<Frame >
<Frame.GestureRecognizers>
<TapGestureRecognizer
Command="{Binding TapCommand,Source={RelativeSource AncestorType={x:Type vm:MainViewModel}}}"/>
</Frame.GestureRecognizers>
</Frame>
</Grid>
</SwipeView>
我做了以下操作,但它没有按预期工作。
<SwipeView ... xmlns:vm="clr-namespace:Todo.ViewModel"
BindingContext="{Binding Source={RelativeSource AncestorType={x:Type vm:MainViewModel}}}"
>
<SwipeView.LeftItems>
<SwipeItems>
<SwipeItem Text="Delete" Command="{Binding DeleteCommand}" />
</SwipeItems>
</SwipeView.LeftItems>
<Grid Padding="0,5">
<Frame >
<Frame.GestureRecognizers>
<TapGestureRecognizer Command="{Binding TapCommand}" />
</Frame.GestureRecognizers>
</Frame>
</Grid>
</SwipeView>
存储库
使用下面的repo来避免得到不一致的结果(我们之间),并确保我们在同一范围内进行讨论。
https://github.com/pstricks-fans/Todo
以下是相关部分:
我的浏览视图:
第一次
主页:
第一个
主视图型号:
public partial class MainViewModel : ObservableObject
{
[RelayCommand]
void Delete(string s){}
[RelayCommand]
async Task Tap(string s){}
}
2条答案
按热度按时间dgenwo3n1#
在您的示例中,SwipeView正在
ItemTemplate
内部使用。您不得更改其BindingContext;必须是相关项目。因此,你最初的目标是不可能的;我们可以简化“Source”表达式,但不能消除它。
我知道的最简单的是:
说明:在“thePage”上,找到包含属性“DeleteCommand”的属性“VM”。对
MainPage
进行以下更改。第一次
wrrgggsh2#
首先,在官方文档中绑定到祖先的格式类似于
{Binding Source={RelativeSource AncestorType={x:Type local:PeopleViewModel}}, Path=DeleteEmployeeCommand}
然后,您可以尝试在构造方法中设置SwipeView的绑定上下文,而不是使用绑定方式。
我已经做了一个样本测试,绑定工作良好:
此时将显示MySwipeView.cs:
我的浏览视图.xaml:
主页面.xaml:
将显示MyViewModel.cs:
无论
BindingContext
是this
还是MyViewModel
,该命令都将成功运行。