Я немного новичок в WPF/XAML (хотя я изучил С#) и был бы очень признателен за любую помощь в моем вопросе. Я некоторое время просматривал другие сообщения и гуглил, но я не могу найти удовлетворительного или подробного ответа, который заставил бы меня продолжить мой проект. Подробности см. ниже. Заранее спасибо!
Задача
У меня есть класс Tile, который состоит из нескольких свойств и обработчика событий. У меня также есть ItemControl с кнопкой (как в DataTemplate) и ItemSource которого представляет собой набор плиток.
Теперь я хочу связать событие «Click» кнопки, чтобы вызвать метод обработчика событий, определенный в классе Tile.
Другими словами, когда я нажимаю кнопку любого элемента в ItemControl, должен вызываться обработчик метода соответствующего экземпляра Tile (из коллекции). Как бы я решил эту проблему?
Ниже приведен весь код, упрощенный, чтобы не отвлекать:
XAML
<Window x:Class="SampleWPF.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="300" Width="300">
<!-- Make a ItemControl for "Tile"s. -->
<ItemsControl x:Name="TileList">
<ItemsControl.ItemTemplate>
<DataTemplate>
<!-- Wire the click event of this Button
to event handler in the Tile class. -->
<Button Content="Show"></Button>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Window>
КОДЕКС
namespace SampleWPF
{
public partial class MainWindow : Window
{
ObservableCollection<Tile> tiles;
public MainWindow()
{
InitializeComponent();
// Adding some sample data for testing.
tiles = new ObservableCollection<Tile>();
tiles.Add(new Tile("Item 1"));
tiles.Add(new Tile("Item 2"));
TileList.ItemsSource = tiles;
}
}
public class Tile : INotifyPropertyChanged
{
public string Data
{ /* Accessors and PropertyNotifiers */ }
public Tile(string data)
{ /* Initializing and assigning "Data" */ }
// INotifyPropertyChanged implementation...
// { ... }
// This event handler should be bound to the Button's "Click" event
// in the DataTemplate of the Item.
public void ShowButton_Click(object sender, EventArgs e)
{
MessageBox.Show("Viewing item from: " + this.Data);
}
}
}
Следовательно, если я нажму первую кнопку «Показать», вывод должен быть «Просмотр элемента из: Элемент 1», а если я нажму вторую кнопку «Показать», вывод должен быть «Просмотр элемента из: Элемент 2».
Итак, каков рекомендуемый/эффективный способ сделать это? Мой код не соответствует этому требованию?