Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

18.02.2011, 16:34

[C# <WPF>] Buttons identifizieren

Hallo Leute,
wie meine Überschrift schon ungefähr verrät Suche ich eine elegante Möglichkeit, aus einem Wrap-Panel einen Button nach Auslösen des Ereignisses Click den Button bzw. eine Nummer, welchen der Button repräsentieren soll genau zu bestimmen. Bsp: ich habe eine Liste voller Buttons:

C#-Quelltext

1
2
3
4
5
<!-- Auschnitt einer XAML-Datei --> 
<button Content="Pizza Salami" click="OnClickButtonItem"/> 
<button Content="Pizza Diabolo" click="OnClickButtonItem"/> 
<button Content="Pizza Pepperonie" click="OnClickButtonItem"/> 
<button Content="Pizza Ferrari" click="OnClickButtonItem"/>  

Nun würde ich gerne jeden Button eine ProduktID geben. Ich könnte das durch Binding realisieren, aber habe momentan keine Ahnung, wie ich das realisieren soll.

Achtung: Sowas wie

C#-Quelltext

1
2
3
4
5
6
7
8
9
/* Code-Ausschnitt teilweise symbolisch gemeint */ 
foreach (var Element in WraperPanel) /* Natürlich geht das so nicht*/ 
{ 
 if ((Button)sender == Element) /* Natürlich geht das so nicht*/ 
 { 
 /* Hier geht's weiter */ 
 } 
}  
  
ist mir viel zu unelegant oder Speicheraufwendig...
Da wäre es ja fast schon schöner den Button um eine ID zu erweitern...

Geht das auch anders?

Grüße,
user710

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

2

18.02.2011, 16:46

Wie wärs mit dem Name Attribut !?

3

18.02.2011, 16:54

?? Was genau meinst du?

DerMark

Treue Seele

Beiträge: 324

Wohnort: Emsdetten

Beruf: Softwareentwickler

  • Private Nachricht senden

4

18.02.2011, 17:02

Quellcode

1
<button Content="Pizza Salami" click="OnClickButtonItem" x:Name="PizzaSalamiButton"/>


PizzaSalamiButton <- wäre dann der name deines Buttons den du so auch im Code verwenden kannst

Und was genau verstehst du am Binding nicht?

5

18.02.2011, 17:08

Nein, das habe ich nicht gemeint! Ich weiß sehr sohl, wie ich den Button im Code verwenden kann. Aber muss ich deshalb auch button.toString() verwenden? Es wäre viel eleganter, mein button mit einer anderen variable zu binden. Dann könnte ich den gebundenen Wert schön weitergeben. Aber button.toString().toInt32() ist einfach zu aufwendig.

DerMark

Treue Seele

Beiträge: 324

Wohnort: Emsdetten

Beruf: Softwareentwickler

  • Private Nachricht senden

6

18.02.2011, 17:13

Du kannst das Tag Propertie für deine Zwecke missbrauchen. Per DataBinding kannst du da einfach ein Int ranplappen oder den Wert direkt dort rein schreiben, wenn du es denn brauchst.

Edit:

Ich würde vorschlagen du baust für deine ProduktButtons eine DataModel Klasse du du perDataContext an deine Buttons setzen kannst.
So kannst du den Namen, Clickverhalten und sonstige Werte schön kapseln und hast nicht direkt etwas mit dem View zu tun.

DerMark

Treue Seele

Beiträge: 324

Wohnort: Emsdetten

Beruf: Softwareentwickler

  • Private Nachricht senden

7

18.02.2011, 17:33

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
public class ProductViewModel
{
  public ProductViewModel(..) {.. }

  public string DisplayName { get; set; }

  public int Id { get; set; }

  public void DoSomething();
}


Quellcode

1
<Button Content={Binding DisplayName} Click="ProductButton_Click">


C#-Quelltext

1
2
3
4
5
public void ProductButton_Click(object sender, RoutedEventArgs e)
{
  var productViewModel = ((Button)sender).DataContext as ViewModel;
  productViewModel.DoSomething();
}


Du musst dann nur noch die ProductViewModels zu den entsprechenden Buttons setzen ala

C#-Quelltext

1
button.DataContext = myProductViewModel


Idealerweise hast du dafür auch geeignete Strukturen. Und noch viel besser wäre es wenn du anstatt Click Commands benutzen würdest, aber man solls ja nicht gleich übertreiben.

8

18.02.2011, 19:58

Also soweit funtkioniert alles. Jetzt möchte ich aber die Bindings manuell (in C#-Code) erstellen. Bis jetzt habe ich diesen Ansatz:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
DataViews.ProductViewModel view;

 Binding bindingName = new Binding();
            bindingName.Source = btn.Content;
            bindingName.Path = new PropertyPath("ProductViewModel.DisplayName");            
            btn.SetBinding(Button.ContentProperty, bindingName);


Binding bindingColor = new Binding();
            bindingColor.Source = btn.Background;
            bindingColor.Path = new PropertyPath("ProductViewModel.DisplayColor");
            btn.SetBinding(Button.BackgroundProperty, bindingColor);
            btn.Width = 30;
 
            view = new DataViews.ProductViewModel();
            view.DisplayName = "Pizza Diabolo";
            view.ID = 2;
            view.DisplayColor = Brushes.BlueViolet;
 
            btn.DataContext = view;
 
            wrapPanelProductItems.Children.Add(btn);



Grüße,
GreenPepper

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »GreenPepper« (18.02.2011, 20:46)


9

18.02.2011, 20:26

gehen wir es jetzt mal anders an:
Wie übersetzt man das hier:

C#-Quelltext

1
<Button Name="Pizza1" Margin="10" Padding="7" Content="{Binding DisplayName}"/>


in C#-Code

DerMark

Treue Seele

Beiträge: 324

Wohnort: Emsdetten

Beruf: Softwareentwickler

  • Private Nachricht senden

10

19.02.2011, 08:09

C#-Quelltext

1
2
DataViews.ProductViewModel view;
var bindingName = new Binding("DisplayName");myBinding.Source = view;BindingOperations.SetBinding(btn, Button.ContentProperty, bindingName);




Was genau meinst du nun bei der xaml übersetzen zu wollen?


Edit: Top Codetags..

Werbeanzeige