Autor Beitrag
DrHoas
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 47



BeitragVerfasst: Mo 07.03.16 13:47 
Hallo,

ich hab ein DockPanel in einem ListBoxItem. Darin ist dann ein TextBlock:
ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
<ListBox Name="LB1" Style="{StaticResource FlipsListBoxStyle}" Margin="10,34,0,0" SelectionMode="Multiple">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <DockPanel Name="dockpanel">
                <TextBlock Text="{Binding}"/>
            </DockPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
    <ListBox.ItemContainerStyle>
        <Style TargetType="{x:Type ListBoxItem}">
            <Setter Property="Focusable" Value="False"/>
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

Im C#-Code hab ich
ausblenden C#-Quelltext
1:
2:
List<String> listString = new List<String>();
LB1.ItemSource = listString;

Zur Laufzeit füge ich also Text in die ListBox ein. Dabei möchte ich dem DockPanel abhängig vom eingefügten Item, ein IntegerUpDown vom Extended WPF Toolkit hinzufügen oder eben nicht. Ich schaff es allerdings nicht das DockPanel anzusprechen. Wie kann ich das machen?

Dank und Gruß

Philipp

Moderiert von user profile iconChristian S.: Code- durch XML- und C#-Tags ersetzt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 07.03.16 18:42 
Hallo,

du scheinst den Begriff Template nicht richtig verstanden zu haben. Dies ist nur eine Schablone, d.h. das konkrete Element wird erst zur Laufzeit erzeugt, d.h. du kannst darauf nicht direkt per Code über den Namen darauf zugreifen.

Warum verwendest du denn auch dafür kein MVM, d.h. greifst per DataBinding auf die ListBox (und dessen Template) zu? Dafür müßtest du dann allerdings das IntegerUpDown-Control schon im Template definieren und einfach dessen Visibility per DataBinding über das ViewModel setzen.

Ansonsten hilft dir vllt. auch Change Templates Dynamically in WPF.
DrHoas Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 47



BeitragVerfasst: Di 08.03.16 17:07 
Den Begriff Template hab ich schon richtig verstanden, dachte aber, dass ich direkt nach dem Erzeugen auf das eben erzeugte Element zugreifen kann.

Interessanterweise hatte ich das Ganze erst so gemacht, dass ich das IntegerUpDown im Template hatte. Ich hab es dann aber wieder rausgenommen, weil ich es in 90 % der Fälle nicht brauche. Außerdem wollte ich manchmal ein IntegerUpDown und manchmal eine ComboBox einfügen.
Ich werde es dann jetzt wohl so machen, dass ich sowohl IntegerUpDown als auch die ComboBox ins Template reinnehme und die Visibility binde.

Hier mal, was ich eigentlich machen möchte. Vielleicht gibt es ja auch eine viel schönere Lösung:
Eine ListBox wird zur Laufzeit gefüllt. Abhängig vom Item soll rechts neben dem Item ein IntegerUpDown, eine ComboBox oder nichts stehen. Die ListBox sieht dann z. B. so aus:

AAA 1 IntegerUpDown (wird hier eingefügt da Item=AAA)
BBB
CCC XYZ ComboBox (wird hier eingefügt da Item=CCC)

Mit dem IntegerUpDown möchte ich den Zähler von AAA ändern können. Mit der ComboBox möchte ich XYZ auswählen.

Bin ich da auf dem richtigen Weg?

Dank und Gruß

Philipp
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 08.03.16 18:19 
Um einzelne Items mit verschiedenen Templates zu benutzen, gibt es den ItemTemplateSelector, s. z.B. Quick Tips to use WPF ListView ItemTemplateSelector oder WPF Based Dynamic DataTemplateSelector.
DrHoas Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 47



BeitragVerfasst: Mi 09.03.16 08:23 
Das klingt genau nach dem, was ich brauche. Danke für den Tipp.

Philipp