myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns
» Datenschutzerklärung
» Impressum

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » GUI: WPF und Silverlight » Wie kann ich einen "Clear" Button unter einer Combobox (ItemSource) anzeigen?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

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

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
_Cashisclay _Cashisclay ist männlich
myCSharp.de-Mitglied

Dabei seit: 29.10.2014
Beiträge: 238


_Cashisclay ist offline

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

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

_Cashisclay hat dieses Bild (verkleinerte Version) angehängt:
Unbenannt.png
Volle Bildgröße

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von _Cashisclay am 04.04.2019 09:05.

04.04.2019 08:44 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
BhaaL BhaaL ist männlich
myCSharp.de-Mitglied

Dabei seit: 14.02.2008
Beiträge: 609
Entwicklungsumgebung: VS2017


BhaaL ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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):

C#-Code:
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
}

XML-Code:
<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}"/>
   ...</>
04.04.2019 09:12 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
_Cashisclay _Cashisclay ist männlich
myCSharp.de-Mitglied

Dabei seit: 29.10.2014
Beiträge: 238

Themenstarter Thema begonnen von _Cashisclay

_Cashisclay ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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?

_Cashisclay hat dieses Bild (verkleinerte Version) angehängt:
Unbenannt.png
Volle Bildgröße

04.04.2019 12:55 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
BhaaL BhaaL ist männlich
myCSharp.de-Mitglied

Dabei seit: 14.02.2008
Beiträge: 609
Entwicklungsumgebung: VS2017


BhaaL ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von _Cashisclay:
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).
04.04.2019 13:34 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
_Cashisclay _Cashisclay ist männlich
myCSharp.de-Mitglied

Dabei seit: 29.10.2014
Beiträge: 238

Themenstarter Thema begonnen von _Cashisclay

_Cashisclay ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Danke smile !

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 Daumen runter

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von _Cashisclay am 04.04.2019 14:57.

04.04.2019 14:44 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 2 Monate.
Der letzte Beitrag ist älter als 2 Monate.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 16.06.2019 04:40