ContextMenu je nach Enumerationswert eines Bindingelements (Selector?)

  • WPF

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von EiPott.

    ContextMenu je nach Enumerationswert eines Bindingelements (Selector?)

    Hallo,

    Ich habe mich entschlossen, WPF zu lernen, da ich merke, was für ein Wunderwerk das doch ist und WinForms mich frustrieren. ^^

    Nun stehe ich aber vor einem kleinen Problem.
    Nehmen wir an, ich habe eine Klasse "Ding" (Name, Typ) und die Enumeration "Typ" (Auto, Apfel, Lampe). Nun habe ich ein DataBinding einer ObservableCollection<Ding> an einer ListBox, der ich dynamisch neue "Dinge" hinzufüge. Jetzt möchte ich gerne, je nach Typ, ein anderes ContextMenu dem Item verpassen. Ein Auto zum Beispiel kann fahren und bremsen, ein Apfel gegessen werden und eine Lampe an und ausgeschaltet werden. Folglich hätte je nach Enumerationswert das ListBoxItem ein anderes ContextMenu:

    Typ = Typ.Auto:
    • fahren
    • bremsen

    Typ = Typ.Apfel:
    • gegessen werden

    Typ = Typ.Lampe:
    • anschalten
    • ausschalten

    Wie realisiere ich, dass je nach Enumerationswert des Binding-Elements ein anderes ContextMenu erscheint? Ich hätte auf das Wort "Selector" getippt, habe dazu aber nichts passendes in Google gefunden.

    Ich hoffe, es ist nicht all zu umständlich erklärt, ansonsten darf gerne nachgefragt werden.

    Danke im vorraus,
    EiPott
    Macht irgendwie keinen Sinn, solche Sachen zusammen in einen Topf zu werfen. Eine gemeinsame Basisklasse macht ja nur Sinn, wenn die erbenden Klassen Member verschieden überschreiben. Zwischen einem Auto und nem Apfel gibt es aber nunmal keine wirklichen Gemeinsamkeiten, also ist es auch mehr als unlogisch, sie von der selben Basisklasse erben zu lassen. Zumal es dir auch gar nichts bringt, denn um die jeweiligen Member aufzurufen müsstest du ja immer Casten (oder hat deine Basisklasse etwa sowohl eine Fahren-Mehtode alsauch eine GegessenWerde-Methode? - was natürlich ebenso wenig Sinn macht).
    Danke für deine Antwort.

    Die Klasse "Ding" dient nur als Beispiel, habe mich wohl zu undeutlich ausgedrückt. :)

    Gibt es denn eine Art Selektoren in WPF, mit denen ich nach gewissen Kriterien gewisse Subelemente festlegen könnte?
    Z. B. so (pseudo):

    XML-Quellcode

    1. <Grid>
    2. <ListBox ...>
    3. <Template>
    4. <Selector Property="{Binding Aktiviert}" Value="Ja">
    5. <!-- Blubber Elemente -->
    6. <Label></...>
    7. </Selector>
    8. <Selector Property="{Binding Alter}" Value="ZuAlt">
    9. <Button></...>
    10. </Selector>
    11. <Selector Property="{Binding Aktiviert}" Value="Nein">
    12. <Blubber></...>
    13. </Selector>
    14. </Template>
    15. </ListBox>
    16. </Grid>
    Na gut, noch ein Versuch.

    Ich habe eine Liste von Wörtern, von denen man ein paar per Button löschen darf, ein paar jedoch nicht. Die, die man löschen darf, sollen den Button haben, die, die man nicht löschen darf, dürfen den nicht besitzen (damit man das Wort nicht löschen kann).



    Also:
    • Käse, Loeschbar = True
    • Milch, Loeschbar = False
    • Auto, Loeschbar = True
    • Busch, Loeschbar = False

    Jedes Wort besitzt eine Eigenschaft, ob man es löschen darf oder nicht. (Loeschbar = True oder False)

    Die ListBox ist per Binding mit der Liste verbunden und erzeugt also eine schöne Liste mit den Wörtern (da per Template definiert). Nun, wenn ich jetzt den Button ins Template einbaue, so haben alle den Knopf, wenn ich ihn nicht einbaue, hat keines diesen Knopf (ist beides blöd). Nun soll aber die Eigenschaft "Loeschbar", die jedes Wort besitzt, bestimmen, ob der Button in das jeweilige Item eingebaut werden soll, oder nicht. (Button für's löschen)

    Wie realisiere ich so etwas?

    Der Begriff Selektor schien mir am passendsten, da es ja in CSS das hier gibt:

    CSS-Quellcode

    1. input[type="text"]
    2. {
    3. ...
    4. }
    5. /* Wie jetzt hier mit den Wörtern wär es bspw. so */
    6. Wort[loeschbar=True]
    7. {
    8. Button rein (für's Löschen)
    9. }
    10. /* ansonsten nicht */

    Also betrifft das in den Klammern geschriebene Design nur Eingabefelder, die der Bedingung übereinstimmen.

    Ich hoffe es ist nun verständlich.

    lg. EiPott
    mach ein Listbox.ItemTemplate (ein DataTemplate) mit Text und Button.
    Vom Button bindeste die Visible-Property an die DatenItem.Löschable - Property
    gugge Binding-Picking im Xaml-Editor - da gibts auch ein komplexes DataTemplate in einem ItemsControl

    Selector ist in Wpf die Basisklasse aller Controls, mit denen man was auswählen kann, zb ItemsControl, Listbox, listview, Treeview, Datagrid.