簡體   English   中英

在XAML中使用動態名稱創建WPF按鈕

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM