Fireplace April 2026

C# XAML um Namespace erweitern

Agyss

Cadet 4th Year
Registriert
Dez. 2011
Beiträge
73
Hallo zusammen,

wiedermal stehe ich vor einem kleinen Problem in WPF.
Und zwar möchte ich, dass ein Event auslöst, sobald sich der Text einer Combobox ändert.
Dazu gab mir Google diesen Tipp:
PHP:
<ComboBox IsEditable="True" TextBoxBase.TextChanged="ComboBox_TextChanged" />
soweit, sogut.
TextBoxBase befindet sich im Namespace: System.Windows.Controls.Primitives

Nun bin ich aber nicht in der Lage, diesen in das XAML der WPF Anwendung zu integrieren.

Bitte um eure Hilfe.

Danke
Schönen Abend
Agyss
 
Nutzt du Visual Studio? Wenn ja, dann geh mal zu den Eigenschaften deiner ComboBox, oben auf Events und such das TextChanged Ereignis und mach dort nen Doppelklick in der linken Spalte.

Brauchst du wirklich TextChanged oder gehts auch mit SelectionChanged?
 
Ja ich nutze VS, das TextChanged Ereignis gibt es da nicht, SelectionChanged nützt mir nichts.

Die Dropbox beinhaltet als Drop-Down Element einen Kalender, wird dort ein Datum ausgewält, wird dieses in der DropBox angezeigt, daher wirklich TextChanged.
 
Wenn ich die Zeile aus deinem 1. Post bei mir einfüge, dann taucht das Ereignis in der Liste auf.
Eleganter wäre es wahrscheinlich ein Binding zwischen dem im Kalender ausgewählten Element und der ComboBox herzustellen. Habe vor Kurzem mit WPF angefangen, von daher müsste ich das selbst ersteinmal versuchen.
 
Ok seltsam, bei mir gehts inzwischen auch...

Kannst du mir noch erklären, warum IntelliSense es mir nicht vorschlägt, bzw. warum es unterstrichen wird, bis es fertig geschrieben ist?

Das mit dem Binding wäre eine super Sache, jedoch bin ich damit leider auch nocht nicht all zu vertraut ;)
 
Code:
<ComboBox IsEditable="True" TextBoxBase.TextChanged="ComboBox_TextChanged" />
Da hast du irgendwas gegoogelt, aber nicht WPF :) Eine ComboBox ist ein Selector und keine TextBox.
Wenn du unbedingt ein Event brauchst, dann nimm das KeyUp Event. Eleganter und mehr der "WPF-Way of Life" wäre eine Two-Way Binding auf das Text Property und im Setter dementsprechend deine Logik anzuwenden/aufzurufen.
 
holy,

wenn ich die ComboBox als IsEditable="True" kennzeichne, bietet sie mir ein Textfeld, dessen Text geändert werden kann.
Das KeyUp Event bietet sich nicht an, da per Drop-Down der Kalender aufgerufen wird.
Jedoch klingt auch deine Idee nicht schlecht, kannst du sie genauer erläutern?
 
Probier mal die Textbox, die das gleiche anzeigen soll, wie die Combobox, über ein ElementBinding auf Combobox.Text zu binden...
 
es gibt keine Textbox, es gibt nur die ComboBox
 
Agyss schrieb:
holy,

wenn ich die ComboBox als IsEditable="True" kennzeichne, bietet sie mir ein Textfeld, dessen Text geändert werden kann.
Das KeyUp Event bietet sich nicht an, da per Drop-Down der Kalender aufgerufen wird.
Jedoch klingt auch deine Idee nicht schlecht, kannst du sie genauer erläutern?

OK, du hast recht. Sorry für den dummen Kommentar meinerseits ;)
Bzgl. des Bindings. Z.B. sowas:

Code:
<ComboBox Text={Binding MyProperty,Mode=TwoWay} />

In deinem DataContext brauchst du dann ein Property MyProperty (und INotifyPropertyChanged muss implementiert werden):
Code:
private string _text;
public string MyProperty
{
  get { return _text; };
  set
  {
    if ( SetProperty( ref _text, value ) )
    {
      // hier was auch immer passieren soll, wenn sich der Text ändert..
    }
  }
}

// Der Vollständigkeit halber:
protected bool SetProperty<T>( ref T storage, T value, [CallerMemberName] string propertyName = null ) 
{
  if ( Equals( storage, value ) )
  {
    return false;
  }

  storage = value;
  RaisePropertyChanged( propertyName );
  return true;
}

protected void RaisePropertyChanged( string propertyName )
{
  PropertyChangedEventHandler handler = PropertyChanged;
  if ( handler != null )
  {
    handler( this, new PropertyChangedEventArgs( propertyName ) );
  }
}
Agyss schrieb:
es gibt keine Textbox, es gibt nur die ComboBox
Erdmännchen meint soetwas:
Code:
<ComboBox x:Name="MyComboBox" />
<TextBox Text={Binding ElementName=MyComboBox,Path=Text} TextChanged="MyTextChangedHandler" />
 
Zuletzt bearbeitet:
Achso ok, sorry Erdmännchen :(

danke für deine ausfühliche Antwort, ich werde es ausprobieren sobald ich Zeit dafür finde, sieht jedoch vielversprechend aus.

Danke :)
 
Ja so ganz bin ich mir immernoch nicht sicher, was du eigentlich bezweckst, aber mit deinem Textbox Zeug hab ich wohl gedacht, du willst das eben nochmal darstellen. So wie holy es beschrieben hat.

Für WPF ist es essentiell nötig sich das MVVM Pattern (Model - View - ViewModel) anzueignen. Denn nur so kann man die einzelnen Komponenten voneinander entkoppeln.
Hierbei sei auf das MVVM Light Toolkit hingewiesen (http://mvvmlight.codeplex.com/) (gibt auch nen Nuget-Feed), welches einem die ganze Arbeit mit INotifyPropertyChanged und Commands abnimmt...

Dadurch entsteht eine Programm Struktur, die um einiges leichter zu warten und zu ergänzen ist...
 
Zuletzt bearbeitet:
Zurück
Oben