Bir sütundaki düğme, Click olay işleyicisine geldiği satırı alıyor


98

WPF Datagrid'imin öğe kaynağını, DAL'ımdan döndürülen Nesnelerin Listesi olarak ayarladım. Ayrıca bir düğme içeren fazladan bir sütun ekledim, xaml aşağıda.

<toolkit:DataGridTemplateColumn  MinWidth="100" Header="View">
    <toolkit:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Button Click="Button_Click">View Details</Button>
        </DataTemplate>
    </toolkit:DataGridTemplateColumn.CellTemplate>
</toolkit:DataGridTemplateColumn>

Bu güzelleşiyor. Ancak Button_Click yönteminde, düğmenin bulunduğu datagrid üzerindeki satırı alabilmemin bir yolu var mı? Daha spesifik olarak, nesnelerimin özelliklerinden biri "Id" dir ve bunu olay işleyicisindeki başka bir formun yapıcısına iletebilmek istiyorum.

private void Button_Click(object sender, RoutedEventArgs e)
    {
        //I need to know which row this button is on so I can retrieve the "id"  
    }

Belki xaml'imde fazladan bir şeye ihtiyacım var ya da belki bunu dolaylı bir şekilde yapıyorum? Herhangi bir yardım / tavsiye takdir edilmektedir.

Yanıtlar:


128

Temel olarak, düğmeniz bir satır veri nesnesinin veri bağlamını devralacaktır. Onu MyObject olarak adlandırıyorum ve umarım MyObject.ID istediğiniz şeydir.

private void Button_Click(object sender, RoutedEventArgs e)
{
    MyObject obj = ((FrameworkElement)sender).DataContext as MyObject;
    //Do whatever you wanted to do with MyObject.ID
}

7
Bu tür şeyleri yapmanın ideal yolu, komutları kullanmaktır (Temelde MVVM kalıbı), Veri Nesnenizde (ViewModel) bir komut oluşturabilir ve Button.Command'i çağırabilirsiniz, Böylece Button tıklama gibi arkasında herhangi bir kod olmayacaktır.
Jobi Joy

1
@ JobiJoy: Command / RelayCommand kullanarak bunun bir örneğine sahip misiniz? Birkaç şey deniyorum ama işe
yarayamıyorum

Gördüğüm komut örnekleriyle ilgili sorun, seçilen datagrid öğesini görünüm modelinizin bir üyesine vermeniz gerektiğidir ve bu nedenle komutu bir silme düğmesi için yeterince iyi oluşturmak zor. Uygulamamdaki hemen hemen her şeyi silmek için kullanabileceğim bir silme düğmesi şablon sütun kaynağı istiyorum.
Eric

47

Bunu yapmaktan hoşlandığım başka bir yol, kimliği düğmenin CommandParameter özelliğine bağlamaktır:

<Button Click="Button_Click" CommandParameter="{Binding Path=ID}">View Details</Button>

Ardından, kodda olduğu gibi erişebilirsiniz:

private void Button_Click(object sender, RoutedEventArgs e)
{
    object ID = ((Button)sender).CommandParameter;
}

Neden olayları ve komutları karıştırıyorsunuz? Bir Komut kullanın ve içindeki komut parametresini kullanın.
ProfK

1
3 cevap: Neden olmasın? Basitlik. Ve OP, komutları değil, olay işleyicileri soruyor. Bir komut aşırı olabilir. Kullanımı CommandParameter, özelliğin amaçlanan kullanımı olmayabilir, ancak anlamsal olarak, Tagişleyicideki bağlı nesneden kimliği almaktan daha anlamlı ve daha basittir. Komutları tercih ederseniz, bu yaklaşım iyidir, ancak kullanmayacaksanız neden karmaşıklığı ekleyesiniz?
xr280xr

11

DataContext komut parametresine bağlanan ve Jobi Joy'un söylediği gibi MVVM'ye uyan başka bir yol, düğmenin veri bağlamı form satırını devraldığını söylüyor.

XAML'de düğme

<RadButton Content="..." Command="{Binding RowActionCommand}" 
                         CommandParameter="{Binding RelativeSource={RelativeSource Mode=Self}, Path=DataContext}"/>

Komut uygulaması

public void Execute(object parameter)
    {
        if (parameter is MyObject)
        {

        }
    }

Öyleyse, RowActionCommand Modelde mi olacak yoksa düğmenin veri içeriğini ViewModel'e sıfırlar mısınız?
Tom Padilla

@ PetrŠebesta "RowActionCommand, her satır görünüm modelinde tanımlanır." Bu hiç mantıklı değil. Ama her neyse, güzel çözüm.
Igor

4
MyObject obj= (MyObject)((Button)e.Source).DataContext;

0

DataGrid'inizin DataContext'i bir DataView nesnesiyse (DataTable'ın DefaultView özelliği), bunu da yapabilirsiniz:

private void Button_Click(object sender, RoutedEventArgs e) {
   DataRowView row = (DataRowView)((Button)e.Source).DataContext;
}

Olmalı e.OriginalSource. yerine e.Source.
Bigeyes

Cidden Bigeyes, cevabım gerçek, canlı, çalışan koddan!
SurfingSanta
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.