我无法在SwipeItem
内为RadListView
工作的任何绑定(类似于标准ListView
)上工作。特别是,我试图绑定到Command
属性;但是,我试图绑定到其他属性,例如Text
,但无济于事。
<telerikDataControls:RadListView ItemsSource ="{Binding Users, Mode=OneWay}">
<telerikDataControls:RadListView.ItemTemplate>
<DataTemplate>
<SwipeControl>
<SwipeControl.RightItems>
<SwipeItems>
<SwipeItem Text="Delete"
Background="Red"
Foreground="White"
Command="{Binding DeleteCommand}">
<SwipeItem.IconSource>
<SymbolIconSource Symbol="Delete"/>
</SwipeItem.IconSource>
</SwipeItem>
</SwipeItems>
</SwipeControl.RightItems>
<Grid>
<TextBlock Text="{Binding Name"/>
</Grid>
</SwipeControl>
</DataTemplate>
</telerikDataControls:RadListView.ItemTemplate>
</telerikDataControls:RadListView>
Users
是在View的ViewModel的构造函数中设置的;它是ObservableCollection
中的UserViewModel
,每个都有我尝试使用的属性(带有PropertyChanged事件)。
Name
绑定在模板中更下方的Grid
中起作用,我已经检查了DataContext
中的SwipeControl
,它是UserViewModel
。
在测试中,我在Event
上设置了SwipeItem
:
<SwipeItem Text="Delete"
Background="Red"
Foreground="White"
Command="{Binding DeleteCommand}"
Invoked="SwipeItem_Invoked">
并在后面的代码中对其进行了处理:
private void SwipeItem_Invoked(SwipeItem sender, SwipeItemInvokedEventArgs args)
{
UserViewModel userToDelete = (UserViewModel)args.SwipeControl.DataContext;
}
我在这里可以看到sender.Command
是null
。
显然,快速的解决方案是使用事件模式;但是,我尝试将其保留为MVVM,并尽可能避免代码隐藏。我以前从未遇到过绑定到属性的问题,所以可以想象我只是在做一些根本错误的事情。
谢谢。
编辑:
public class UserViewModel : MvxNotifyPropertyChanged // MvvmCross
{
public IMvxAsyncCommand DeleteCommand { get; }
private string _name;
public string Name // this property is bound in the Grid but will not bind in the SwipeItem
{
get => _name;
set => SetProperty(ref _name, value);
}
}
答案 0 :(得分:0)
如果Invoked事件正在触发,但是您无法使Command绑定起作用,那么您可以尝试使用XAML行为(也称为Blend Behaviors)将命令连接到正在触发的事件。然后,这应该可以使您的代码对MVVM保持友好。
首先,安装Microsoft.Xaml.Behaviors.Uwp.Managed nuget程序包,然后将XAML更改为以下内容:
<SwipeItem xmlns:interactivity="using:Microsoft.Xaml.Interactivity"
xmlns:core="using:Microsoft.Xaml.Interactions.Core"
Text="Delete"
Background="Red"
Foreground="White">
<interactivity:Interaction.Behaviors>
<core:EventTriggerBehavior EventName="Invoked">
<core:InvokeCommandAction Command="{Binding Path=DeleteCommand}" />
</core:EventTriggerBehavior>
</interactivity:Interaction.Behaviors>
<SwipeItem.IconSource>
<SymbolIconSource Symbol="Delete"/>
</SwipeItem.IconSource>
</SwipeItem>
为使答案简洁明了,我在SwipeItem元素中定义了交互性和核心xml名称空间-但通常会将它们移至XAML中的顶级元素。
答案 1 :(得分:0)
由于您的Command
位于DataTemplate
内部,因此BindingContext
是Item,因此在ViewModel中定义Command无效。有多种解决方法,例如您可以在项目中定义Command
或绑定到适当的上下文。