WinUI 3 MVVM Toolkit как в Command указать тип евента?
Только начал изучать WinUi и C#, подскажите как сделать событие типа DoubleTapped на StackPanel в DataTemplate и как его подружить с RelayCommand. И как в Command можно указать тип события?
XAML
<Window
x:Class="App2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App2"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<StackPanel>
<StackPanel.DataContext>
<local:TestViewModel x:Name="TestViewModel"/>
</StackPanel.DataContext>
<ListView Margin="10" ItemsSource="{Binding Items}"
HorizontalAlignment="Left" HorizontalContentAlignment="Left">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Name}"
Margin="20,0,20,8"
FontSize="24"
FontStyle="Italic"
FontWeight="SemiBold"
Foreground="DarkBlue" />
<TextBlock Text="{Binding Name}"
Margin="20,0,20,8"
FontSize="16"
Foreground="DarkGray"
Opacity="0.8" />
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<Button Content="Click me!"
Command="{x:Bind TestViewModel.AddItemCommand}">
</Button>
</StackPanel>
</Window>
C#
using Microsoft.Toolkit.Mvvm.ComponentModel;
using Microsoft.Toolkit.Mvvm.Input;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
namespace App2
{
public class TestViewModel : ObservableObject
{
private ObservableCollection<Item> _items { get; set; }
public TestViewModel()
{
AddItemCommand = new RelayCommand(AddItem);
_items = new ObservableCollection<Item>();
_items.Add(new Item(0, "000"));
_items.Add(new Item(1, "111"));
_items.Add(new Item(2, "222"));
}
public ObservableCollection<Item> Items
{
get => _items;
}
public ICommand AddItemCommand { get; }
private void AddItem() => _items.Add(new Item(8, "888"));
}
public class Item
{
public int Id { get; set; }
public string Name { get; set; }
public Item() { }
public Item(int id, string name) { Id = id; Name = name; }
}
}
Может неправильно ещё излагаю мысль, программировать начал совсем недавно. Нужно сделать нечто такое: StackPanel DoubleTapped="StackPanel_DoubleTapped" только как это сделать это в вьюмодели ума не приложу.
Ответы (1 шт):
Автор решения: aepot
→ Ссылка
Нормальных способов на чистом XAML это сделать я пока не нашел, но можно вот так:
<ListView DoubleTapped="ListView_DoubleTapped"/>
Кодбихайнд
public void ListView_DoubleTapped(object sender, DoubleTappedRoutedEventArgs e)
{
object item = ((Selector)sender).SelectedItem;
ICommand command = TestViewModel.AddItemCommand;
if (command.CanExecute(item))
command.Execute(item);
}
Еще поищу решения, как время будет. Пока, к сожалению, такой возможности нет.