none
ListboxItem, ControlTemplate, Style oder DataTemplate ? RRS feed

  • Frage

  • Hallo zusammen,

    bin noch recht neu in WPF, daher ist mir noch nicht immer ganz klar welchen Ansatz man wählen sollte.

    Zu meinem Problem:
    Ich habe Touchanwendung (nicht Win7) bei der eine Liste ähnlich wie auf aktuellen MobileDevices auf und abscrollen soll.
    Habe das ganze mit einem Scrollviewer realisiert und klappt soweit auch.
    Im Scrollviewer befindet sich ein ItemsControl.
    Hier sollen jetzt spezielle Items rein:
    1. Haben die Items ein eigenes Aussehen (Links ein Farbfeld, rechts 2 Textzeilen)
    2. Soll eine Check-Funktion implementiert werden (wenn checked, dann hat das item ein anderes Aussehen)
    3. Sollte die Listbox den Inhalt einer Liste wiederspiegeln und über die Items gewisse Eigenschaften des Inhalts wiederspiegeln:
       z.B. Jedes Objekt in der Liste hat eine Visible-Property, die an die Checked-Property bidirektional gebinded werden soll

    Wie würde ich sowas am besten angehen?
    1) Ich könnte CustomControl erstellen (denke aber, dass das eher nicht notwendig ist)
    2) Mit einem DataTemplate arbeiten?
    3) Ein Style?
    4) Ein ControlTemplate?

    Danke schonmal

    Gruß
    mts

    Donnerstag, 20. Oktober 2011 13:59

Alle Antworten

  • Hi,

    ich denke, Du benötigst kein extra CustomControl.

    So, wie Du es beschreibst, würde ich für die Liste selber einen Style erstellen. Wenn Du also eine ListBox nutzt, müsstest Du dafür einen Stil für das "ListBoxItem" entwerfen. In dem Style würde ich jedoch nicht das Aussehen der Elemente selbst, sondern die besonderen Verhaltensweisen der Liste codieren. Das Aussehen könntest Du dann mit einem DataTemplate erledigen. Dazu würde ich an die Eigenschaft "Checked" Deiner Elemente einen Trigger setzen, der dann die entsprechenden Änderungen vornimmt (z.B. Farbe ändern, Skalierung, Transparenz, etc.).

    Für das von Dir unter 1.) dargestellte Aussehen könnte das DataTemplate folgendermassen aussehen:

    <DataTemplate>
    <Grid>
    <Grid.ColumnDefinitions>
    <ColumnDefinition Width="Auto" />
    <ColumnDefinition />
    </Grid.ColumnDefintions>
    <Border Grid.Column="0" Background="[Farbe]" />
    <DockPanel Grid.Column="1">
    <TextBlock DockPanel.Dock="Top" Text="1. Zeile" />
    <TextBlock DockPanel.Dock="Top" Text="1. Zeile" />
    </DockPanel>
    </Grid>
    </DataTemplate>
    

    Viele Grüße

    Christoph

    Samstag, 22. Oktober 2011 14:51
  • Hi Christoph,

    vielen Dank für deine Antwort. Habe das jetzt genau so gemacht, allerdings habe ich ein Problem mit dem Style.
    Grundsätzlich möchte ich, wie von dir vorgeschlagen, im Style nur diverse Setter unterbringen, die auf bestimmte Events reagieren.

    Jetzt nutze ich allerdings keine ListBox, sondern ein itemsControl.
    Das ItemsControl hat jetzt von mir eine ItemTemplate bekommen, aber so etwas wie ein ItemStyle gibt es nicht.
    Wie weise ich denn jetzt denn jetzt ein entsprechendes Style zu, und welchen TargetTyp setze ich da?

     

    Danke

    mts

    Montag, 7. November 2011 12:07
  • Hi mts,

    Du kannst die Trigger im Template nutzen. ListBox leitet sich übrigens von ItemsControl ab. Eventuell verwendest Du doch einfach eine ListBox. Macht nach außen hin keinen Unterschied.

    Viele Grüße

    Christoph

    Dienstag, 8. November 2011 12:38