Как сказал Якодер, есть определенно более элегантный способ сделать это. Однако, если вы хотите использовать подход с динамическими именами, вы должны иметь возможность заставить его работать, используя присоединенное свойство, например так:
namespace ListBoxExample
{
public static class TagAttach
{
public static readonly System.Windows.DependencyProperty TagProperty =
System.Windows.DependencyProperty.RegisterAttached(
"Tag", typeof (string), typeof (TagAttach));
public static void SetTag(System.Windows.UIElement element, string value)
{
element.SetValue(TagProperty, value);
}
public static string GetTag(System.Windows.UIElement element)
{
return (string)element.GetValue(TagProperty);
}
}
}
<Window x:Class="ListBoxExample.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:loc="clr-namespace:ListBoxExample"
Title="Window1" Height="300" Width="300">
<Grid>
<ListBox ItemsSource="{Binding}" Grid.IsSharedSizeScope="True">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="A" />
<ColumnDefinition SharedSizeGroup="B" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding Position}"/>
<Label Grid.Column="1" Content="{Binding Name}" FontSize="18" Margin="0,10,0,0" />
<WrapPanel Grid.Column="2" >
<Button Click="MoveUpClick" loc:TagAttach.Tag="{Binding Name}">Up</Button>
<Button Click="MoveDownClick" loc:TagAttach.Tag="{Binding Name}">Down</Button>
</WrapPanel>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</Window>
namespace ListBoxExample
{
public partial class Window1
{
public Window1()
{
InitializeComponent();
DataContext = new[]
{
new {Name = "Tom", Position = "Butcher"},
new {Name = "Dick", Position = "Baker"},
new {Name = "Harry", Position = "Candlestick Maker"}
};
}
private void MoveUpClick(object sender, System.Windows.RoutedEventArgs e)
{
System.Windows.MessageBox.Show("Up - " + TagAttach.GetTag(sender as System.Windows.UIElement));
}
private void MoveDownClick(object sender, System.Windows.RoutedEventArgs e)
{
System.Windows.MessageBox.Show("Down - " + TagAttach.GetTag(sender as System.Windows.UIElement));
}
}
}