[英]Creating a WPF button with a dynamic name in XAML
我在WPF中有一個綁定的ListBox,其中每個項目都有一個向上/向下按鈕,可以在列表框中向上或向下移動該項目。
但是我需要知道哪個按鈕觸發了事件,所以我想將按鈕的名稱設置為“ UpButton” + listBoxItem.Text類型的東西。
這是XAML的簡化版本
<ListBox>
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding Path=Position}"/>
<Label Grid.Column="1" Content="{Binding Path=Name}" FontSize="18" Margin="0,10,0,0" />
<WrapPanel Grid.Column="2" >
<Button Click="MoveUpClick" Name="UpButton">Up</Button>
<Button Click="MoveDownClick" Name="DownButton">Down</Button>
</WrapPanel>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
如果有人知道那里的控件可以提供類似的排序功能,並且/或者可以通過DragDrop對其進行排序,那么我將不勝感激,因為我打算在假期前逾時2小時。
正如gimalay所說,在Click事件處理程序中,您可以從發送者的數據上下文中獲取關聯的項目(作為數據模板的一部分)。
Button senderButton = sender as Button;
var item = senderButton.DataContext;
約瑟夫的建議對於這樣一個簡單的問題可能是過大了。
在事件處理程序中,Sender(button).DataContext屬性將設置為ItemsSource項目。 如果要獲得某種與發件人有關的控件,請使用VisualTreeHelper。
就像Yacoder所說的那樣, 絕對有一種更優雅的方法。 但是,如果您想使用動態名稱方法,則應該能夠使用如下所示的附加屬性使其起作用:
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));
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.