Связывание SwipeItem XAML игнорируется - PullRequest
0 голосов
/ 30 ноября 2018

У меня проблемы с получением привязки к работе для 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 установлено в конструкторе ViewModel для View;это 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);
    } 
}

Ответы [ 2 ]

0 голосов
/ 21 мая 2019

Поскольку ваш Command находится внутри DataTemplate, его BindingContext является элементом, поэтому определение команды в модели представления не будет работать.Существуют различные способы решения этой проблемы, например, вы можете определить Command в элементе или привязать к нужному контексту.

0 голосов
/ 21 мая 2019

Если инициированное событие запускается, но вы не можете заставить работать привязку Команды, то вы можете попробовать использовать XAML Behaviors (aka Blend Behaviors) для привязки вашей команды к вызывающему событию.Это позволит вам сохранить дружественный код MVVM.

Сначала установите пакет nuget Microsoft.Xaml.Behaviors.Uwp.Managed, а затем измените свой 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>

Для краткости ответа я определил пространства имен интерактивности и ядра xml в элементе SwipeItem, но они обычно перемещаются в элемент верхнего уровня в вашем XAML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...