Laden...

Wie kann ich einen "Clear" Button unter einer Combobox (ItemSource) anzeigen?

Erstellt von _Cashisclay vor 4 Jahren Letzter Beitrag vor 4 Jahren 993 Views
_
_Cashisclay Themenstarter:in
277 Beiträge seit 2014
vor 4 Jahren
Wie kann ich einen "Clear" Button unter einer Combobox (ItemSource) anzeigen?

Hallo zusammen,

hat jemand so etwas schon einmal gebastelt?
Ich google jetzt schon seit gestern und bin noch zu keinem zufriedenstellendem Ergebnis gekommen.

Eventuell kann ja jemand weiterhelfen.

Edit : Es geht quasi um einen Clear Button am Ende der Liste

Grüße

656 Beiträge seit 2008
vor 4 Jahren

Die Billiglösung wäre ein zusätzliches Item in der ItemSource, wo dann einfach ein anderes DataTemplate dranhängt und den Button generiert. Aber das ist irgendwie unhübsch.
Alternativ schreibst du ein eigenes Control und definierst dafür ein Control Template, was wie die Combobox aussieht - nur dass du im Dropdown-Berech zusätzlich noch deinen Button hinzufügst (oder vielleicht sogar mehrere, über ein ItemsControl aus einer DependencyProperty aus deinem Control wo Commands drin sind).

Könnte in etwa so aussehen (das Template für die Combobox kannst du dir per Blend oder Google raussuchen, das wär vermutlich zu lang um hier als Ganzes zu posten):

public class MyComboBox : ComboBox
{
  static MyComboBox()
  {
    // WPF instruieren, dass es standardmäßig einen Style anwenden soll, dessen Key typeof(MyComboBox) ist:
    DefaultStyleKeyProperty.OverrideMetadata(typeof(MyComboBox), new FrameworkPropertyMetadata(typeof(MyComboBox)));
  }
  public static readonly DependencyProperty DropDownCommandsProperty = DependencyProperty.Register(nameof(DropDownCommands), typeof(IEnumerable<ICommand>), typeof(MyComboBox), new PropertyMetadata(null));
  public IEnumerable<ICommand> DropDownCommands
  {
    get => (IEnumerable<ICommand>)GetValue(DropDownCommandsProperty);
    set => SetValue(DropDownCommandsProperty, value);
  }
  // ...möglicherweise mehr Code, je nachdem was du brauchst
}
<Style x:Key="{x:Type local:MyComboBox}" BasedOn="{StaticResource {x:Type ComboBox}}" TargetType="{x:Type local:MyComboBox}">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type local:MyComboBox}">
        <!-- der Inhalt von dem Template hier ist eine Kopie des Standardmäßigen ComboBox Template. Einfach von Blend, Google oder sonstwo hier reinkopieren und dann anpassen. -->
        <Grid ...>
          <Popup ...>
            <!--
             Ab hier wirds interessant; normal ist hier ein DropShadowChrome mit Border usw. drin, die du aus Look&Feel Gründen vielleicht auch willst.
             Das StackPanel (oder auch ein Grid, wie du willst) ersetzt das, was "aufklappt"
             -->
            <StackPanel Orientation="Vertical">
              <StackPanel.Resources>
                <!-- dein Button (oder Buttons); hier so Stylen wie dus gerne möchtest. Wird dann unten im ItemsControl genutzt. -->
                <DataTemplate TargetType="ICommand"><Button/><DataTemplate>
              </StackPanel.Resources>
              <ScrollViewer ...> <!-- hier sind deine Items drin --> </ScrollViewer>
              <!-- hier sind sind dann die Buttons (wo du gern auch vorher die Trennlinie etc. einbauen kannst) -->
              <ItemsControl ItemSource="{TemplateBinding DropDownCommands}"/>
   ...</>
_
_Cashisclay Themenstarter:in
277 Beiträge seit 2014
vor 4 Jahren

Danke der Tipp hat schon mal geholfen für den Einstieg.

Wird langsam.

Hab mir jetzt erstmal ein eigenes UserControl gemacht, aber leichter wäre es doch irgendwie, wenn ich ein UserControl vom Typ ComboBox hätte wo ich nur das ControlTemplate erweiter, aber die Eigenschaften wie ItemsSource etc. beibehalten werden.

Geht das?

656 Beiträge seit 2008
vor 4 Jahren

Hab mir jetzt erstmal ein eigenes UserControl gemacht, aber leichter wäre es doch irgendwie, wenn ich ein UserControl vom Typ ComboBox hätte wo ich nur das ControlTemplate erweiter, aber die Eigenschaften wie ItemsSource etc. beibehalten werden.

Geht das?

Ich fürchte nein. Das ist leider auch einer der Punkte, der mich an den Templates ein wenig stört (aber nunmal nicht anders geht) - wenn du das ControlTemplate überschreibst, dann überschreibst du alles. Was umgekehrt auch bedeutet, dass du alles dort rein-replizieren musst und nicht einfach nur als Extension Point sagst "füg da drüben zusätzlich was ein".
Spätestens da haben deine eigenen User Controls aber den Vorteil, dass du so etwas eventuell schon weißt und das Control gleich entsprechend drauf vorbereiten kannst (wie zb. mein Vorschlag einer Command Collection anstatt den Button direkt rein zu werfen. Das könnte man theoretisch sogar noch weiter auflösen und ein "Dropdown Footer" Property oder so anbieten, wo standardmäßig die Command Collection drin ist - is halt alles im Template).

_
_Cashisclay Themenstarter:in
277 Beiträge seit 2014
vor 4 Jahren

Danke 🙂!

Irgendwie wird mein SelectedItem immer auf Null gesetzt sobald ich die Combobox verlasse (Befindet sich in einem DataGrid CellEditTemplate) muss ich da noch irgendwas ergänzen als nur die DependencyProperty?

Edit : Geht jetzt weiß aber nicht warum, hab so viel geändert .. hab den Überblick verloren 🙄