SwipeItem XAML绑定被忽略

时间:2018-11-30 15:32:40

标签: c# mvvm uwp uwp-xaml

我无法在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.Commandnull

显然,快速的解决方案是使用事件模式;但是,我尝试将其保留为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);
    } 
}

2 个答案:

答案 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或绑定到适当的上下文。