2009-09-17 42 views
2

我在WPF中綁定了一個ListBox,其中每個項目都有一個向上/向下按鈕,用於在列表框中向上或向下移動項目。在XAML中創建一個帶有動態名稱的WPF按鈕

但是我需要知道哪個按鈕觸發了事件,所以我想設置按鈕的名稱爲「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小時因假期休假而逾期。

+0

馬克,你爲什麼需要知道按鈕的名稱?它似乎不是「真正的WPF方式」... ... – 2009-09-17 17:56:36

+0

(只是不要誤解我的意思,我正在嘗試提供幫助,只是可能會有更好的方式來做WPF中的竅門,沒有文字東西) – 2009-09-17 18:00:01

+0

每個ListBoxItem有兩個按鈕,所以當我得到一個ClickEvent時,我需要知道什麼ListBoxItem與我單擊的按鈕「關聯」。我幾乎可以肯定,有一種更優雅的方式來做到這一點,因爲我時間不夠。如果有人有類型解釋這種做法的正確方法,我會很高興。 – Mark 2009-09-17 18:04:58

回答

1

由於gimalay說,在Click事件處理程序中,您可以從發件人的數據上下文中獲取關聯的項目(因爲它是數據模板的一部分)。

Button senderButton = sender as Button; 
var item = senderButton.DataContext; 

約瑟夫的建議對於這樣一個簡單的問題是一種矯枉過正。

0

在事件處理程序中,發件人(按鈕).DataContext屬性將被設置爲ItemsSource項目。 如果你想得到一些控制,這與發件人有關,使用VisualTreeHelper。

0

就像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)); 
     } 
    } 
}