Laden...

WPF Template - Code Behind ausführen

Erstellt von m.grauber vor 11 Jahren Letzter Beitrag vor 11 Jahren 3.098 Views
M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 11 Jahren
WPF Template - Code Behind ausführen

Hallo,

Für ein Control habe ich ein Template. Wie muss die XAML-Zeile aussehen, dass ich z. B. beim SelectionChanged Code-Behind ausführen kann?


<ControlTemplate x:Key="ComboBox" TargetType="{x:Type ComboBox}">
  <ControlTemplate.Triggers>
     <EventTrigger RoutedEvent="SelectionChanged">
       RunMyCSharpMethod()
     </EventTrigger>
  </ControlTemplate.Triggers>
</ControlTemplate>

Dieser Code soll bei jedem SelectionChanged jeder ComboBox ausgeführt werden und zwar bevor noch evtl. weiterer an das SelectionChanged angebundene Code ausgeführt wird.

Danke vielmals!

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 11 Jahren

Hallo,

hat wirklich niemand eine Antwort? X(

Vielen Dank

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

5.658 Beiträge seit 2006
vor 11 Jahren

Das Internet hat eigentlich immer eine Antwort 😃

Understanding Routed Events and Commands In WPF

Christian

Weeks of programming can save you hours of planning

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 11 Jahren

Hallo Christian,

ich habe mich sicherlich etwas falsch ausgedrückt. Ich habe auch durch sehr langes Suchen nichts gefunden, da ich auch nicht weiss, nach welchem Begriff ich suchen soll.

Mit dem EventTrigger wird beim SelectionChanged etwas ausgeführt. Das ist ok so und läuft.


<ControlTemplate x:Key="ComboBox" TargetType="{x:Type ComboBox}">
  <ControlTemplate.Triggers>
     <EventTrigger RoutedEvent="SelectionChanged">
       ...
     </EventTrigger>
  </ControlTemplate.Triggers>
</ControlTemplate> 

**
Ich möchte in meinem XAML-Code dieses SelectionChanged zusätzlich abonieren. Im Code Behind eines normalen Controls würde ich es so machen:**


Combo.SelectionChanged += Combo_SelectionChanged;
void Combo_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
  ...
}

**
Da ich aber hier in einem Template bin, geht das so nicht. 🤔**

Wie ist dafür die XAML-Syntax?


<ControlTemplate x:Key="ComboBox" TargetType="{x:Type ComboBox}">
  <ControlTemplate.Triggers>
     <EventTrigger RoutedEvent="SelectionChanged" += "{x:Static local:ComboTemplate_SelectionChanged}">
       ...
     </EventTrigger>
  </ControlTemplate.Triggers>
</ControlTemplate> 

Der Code soll wirklich für alle Controls ausgeführt werden, die dieses Template benutzen.

Vielen Dank!

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

5.658 Beiträge seit 2006
vor 11 Jahren

Hi m.grauber,

ich gehe mal davon aus, du hast dich zu RoutedCommands belesen, und weißt, wie die eingesetzt werden. Was du versuchst, ist im Grunde die Zuweisung eines EventHandlers im ControlTemplate. Das geht natürlich nicht, bzw. nur auf Umwegen. Diese beiden Artikel behandeln meiner Meinung nach das Problem, das du hast:

Handling events from within a ControlTemplate in WPF
Is it possible to set code behind a resource dictionary in WPF for event handling?

Christian

Weeks of programming can save you hours of planning

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 11 Jahren

Hallo Christian,

vielen Dank für Deine Mühe. 👍

Wahrscheinlich bin ich völlig blöd 🤔, aber wohin soll ich das setzen❔

public override void OnApplyTemplate()
...

  1. In allen WPF-Forms nutze ich die normalen WPF-ComboBox (ohne Ableitung!)

  2. Alle WPF-Comboboxen werden durch das Template in meiner App.xaml beeinflusst:

<ControlTemplate x:Key="ComboBox" TargetType="{x:Type ComboBox}">
...

  1. Ich möchte das SelectionChanged meines Templates abonieren - Damit soll mein gewünschter Code bei jedem SelectionChanged jeder Combobox ausgeführt werden - ohne dass dann nochmals je benutzter Combobox separaten Code bemühe.

Ich müsste dann beim Programmstart folgende Zeilen ausführen:

System.Windows.Controls.ComboBox combo = new System.Windows.Controls.ComboBox();
combo.SelectionChanged += combo_SelectionChanged;

dann könnte ich genau definieren, welcher Code ausgeführt werden soll. Leider wirkt sich dieser Code nur auf diese einzelne Combobox aus.

OnApplyTemplate könnte ich auch nur ausführen, wenn ich vorher eine Instanz einer Combobox habe. ** Ich habe aber nur ein Template: **


<ControlTemplate x:Key="ComboBox" TargetType="{x:Type ComboBox}">

Nun habe ich mir auch schon System.Windows.FrameworkTemplate angesehen, komme aber nach Tagen leider noch immer nicht weiter.

Ich habe auch bereits versucht dem Template mit x:Name="" ein Namen zu geben und darauf zuzugreifen. Klappt leider auch nicht.

Bitte nochmals um Hilfe! Danke sehr!

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

J
641 Beiträge seit 2007
vor 11 Jahren

wie wärs mit override metadata, und dann die selected item property mit einem callback ausstatten?
oder ein neues behavior erstellen, in dem kannst du auf jede combobox instanz zugreifen und dich an die evebts hängen. dieses behavior weist du dann im style allen comboboxen zu!

cSharp Projekte : https://github.com/jogibear9988