WPF Заполнение списка, назначение обработчика события по щелчку с настраиваемыми переменными для передачи - PullRequest
1 голос
/ 10 октября 2011

Я заполняю listBox, у каждого элемента списка есть кнопка.

Я заполнил текст в список, но я бы хотел, чтобы у каждой кнопки был правильный обработчик событий иномер дома, который будет передан ему.

Вот код XAML:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded" Background="#FFCBCBCB">
    <Grid>
        <Label Content="Welcome to the house manager" Height="28" HorizontalAlignment="Left" Margin="20,12,0,0" Name="label1" VerticalAlignment="Top" />

        <ListBox Height="253" HorizontalAlignment="Left" Margin="10,46,0,0" VerticalAlignment="Top" Width="481" x:Name="houseList">
            <ListBox.ItemTemplate>
                <DataTemplate DataType="house">
                    <Button Click="choose_house(HOUSE NUMBER HERE)" Background="#FFBEBEBE" BorderThickness="0" Focusable="True" Width="459" BorderBrush="White" Padding="0">
                        <StackPanel Orientation="Vertical" Width="400" VerticalAlignment="Stretch">
                            <TextBlock Margin="0,5,0,0" Text="{Binding street}" HorizontalAlignment="Left" />
                            <TextBlock Margin="0,5,0,0" Text="{Binding postCode}" HorizontalAlignment="Left" />
                        </StackPanel>
                    </Button>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
</Window>

Вот код, который заполняет список в данный момент:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            List<house> houseAddresses = new List<house>();

            // Create a new house
            for (var i = 1; i <= 10; i++)
            {
                house newHouse = new house();
                newHouse.street = i + " Scale Hall Lane";
                newHouse.postCode = "PR4 3TL";
                newHouse.houseNumber = i;

                houseAddresses.Add(newHouse);

            }

            // Go through each house and add them to the list
            foreach (house houses in houseAddresses)
            {
                houseList.Items.Add(houses);
            }
        }

        private void choose_house(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("Clicked");
        }

    }
}

Вот мойкласс дома:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WpfApplication1
{
    class house
    {
        public string street { get; set; }
        public string postCode { get; set; }
        public int houseNumber { get; set; }

    }
}

Я вставил Click="choose_house(HOUSE NUMBER HERE)" в код на кнопке, где у кода был бы правильный обработчик события.

Ответы [ 2 ]

4 голосов
/ 10 октября 2011

Либо приведите свой sender в качестве кнопки и получите его DataContext, либо используйте Command и привяжите CommandParameter к HouseNumber

private void choose_house(object sender, RoutedEventArgs e)
{
    var ctrl = sender as Button;
    var h = ctrl.DataContext as house; // Please capitalize your classes! :)

    MessageBox.Show(h.houseNumber);
}

или

<Button Command="{Binding Path=DataContext.ChooseHouseCommand, 
                          RelativeSource={RelativeSource AncestorType={x:Type ListBox}}}"
        CommandParameter="{Binding houseNumber}" ... />
0 голосов
/ 10 октября 2011

Что вы можете сделать в обработчике кликов:

private void choose_house(object sender, RoutedEventArgs e)
{
    var button = sender as Button;
    if (button != null)
    {
        var yourObject = button.DataContext as house;
        if (yourObject != null)
        {
            //do stuff with your button
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...