Autor Beitrag
Fritziiiii
Hält's aus hier
Beiträge: 8



BeitragVerfasst: So 11.01.15 15:13 
Hallo, ich bins wieder mal.

Ich beschäftige mich mit Datenbindung und habe die ersten Grundlagen auch halbwegs verstanden (auch dank dem hier empfohlenen Buch (Visual C# 2012)), aber jetzt steh ich an einem Punkt, wo ich nicht so recht weiter komm.

Ausgangslage:

Ich erzeuge als erstes eine Liste mit "Hauptelementen" (bei jeden click auf einen button wird ein Hauptelement hinzugefügt)
Jedes dieser Hauptelemente hat wiederum eine Liste mit Unterelementen(Unterelement 1_Ebene).
Die Unterelemente haben wiederum eine Liste mit UnterUnterelementen (Unterelemente 2_ebene).

Die Hauptelemente werden in einer Listbox angezeigt, und bei auswahl eines Elements sollen in einer zweiten Listbox die Details dazu ausgegben werden. Das funktioniert auch soweit, daß die HauptElemente ausgegeben werden und die Unterelemente. Aber an den Unter-Unterelementen beiß ich mir derzeit die Zähne aus. (Hab für ein besseres Verständnis noch ein Bild angehägt.)

Hoffe jemand kann mich bei der Lösung ein bißchen unterstützen.

Gruß
Fritziiiii

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace Dart1
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    /// 
    public class UnterElement_2Ebene
    {
        private string _w_string;
        public string w_string
        {
            set
            {
                _w_string = value;
            } 
            get
            {
                return _w_string;
            }
        }
        public UnterElement_2Ebene(string test_string)
        {
            w_string = test_string;
            MessageBox.Show("wird aufgerufen");
        }
    }

    public class UnterElement_1Ebene
    {
       
        public List<UnterElement_2Ebene> Liste_UE_2E = new List<UnterElement_2Ebene>();

        private int _int_element;
        public int int_element
        {
            set
            {
                _int_element = value;
            }
            get
            {
                return _int_element;
            }
        }

        public UnterElement_1Ebene(string w1, string w2, string w3)
        {
            Liste_UE_2E.Add(new UnterElement_2Ebene("test"));
            Liste_UE_2E.Add(new UnterElement_2Ebene(w2));
            Liste_UE_2E.Add(new UnterElement_2Ebene(w3));
            
            int_element = 1;
            test = "bla";
        }
     
        public string test { get; set; }

    }


    public class Hauptpunkte : INotifyPropertyChanged
    {
        public ObservableCollection<UnterElement_1Ebene> Liste_Elemente_1UE = new ObservableCollection<UnterElement_1Ebene>();
        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
        {
            if (PropertyChanged != null) PropertyChanged(this, e);
        }

        private static int _counter;
        public static int counter
        {
            get
            {
                return _counter;
            }
        }
       
        private int _id;
        public int id
        {
            get
            {
                return _id;
            }
        }
        private string _Name;
        public string Name
        {
            get
            {
                return _Name;
            }
            set
            {
                _Name = value;
            }
        }
        private int _Folge; // dient zur automatischen Namenserweiterung bei gleichen Namen;
        public int Folge
        {
            get
            {
                return _Folge;
            }
            set
            {
                _Folge = value;
            }
        }
        public Hauptpunkte() : this(Convert.ToString(counter),0) { }
        public Hauptpunkte(string name) : this(name, 0) { }
        public Hauptpunkte(string name, int folge)
        {
            
            _Name = name;
            _id = counter;

           
            _Folge = folge;
            Hauptpunkte._counter++;

            Liste_Elemente_1UE.Add(new UnterElement_1Ebene("aa""bb""cc"));
           

            OnPropertyChanged(new PropertyChangedEventArgs(""));  
        }
    }


    public partial class MainWindow : Window
    {
        
        ObservableCollection<Hauptpunkte> Liste_HauptElemente = new ObservableCollection<Hauptpunkte>();

        public MainWindow()
        {
            InitializeComponent();
            ListBox_Hauptelemente.ItemsSource = Liste_HauptElemente;
                      
            ListBox_Hauptelemente.SelectedIndex = 0;
            ListBox_Hauptelemente.Focus();
            TextBox_neuesSpiel.Text = DateTime.Now.ToString("yyyyMMdd");    
        }


        public int folge_ermitteln(string name)
        {

            int neue_folge = 0;

            foreach (Hauptpunkte item in Liste_HauptElemente)
            {
                if (item.Name == name)
                {
                    if (item.Folge >= neue_folge)
                    {
                        neue_folge = item.Folge + 1;
                    }
                }
            }

            return neue_folge;
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            int neue_folge;
            neue_folge  = folge_ermitteln(TextBox_neuesSpiel.Text);
            Liste_HauptElemente.Add(new Hauptpunkte(TextBox_neuesSpiel.Text,neue_folge));
            ListBox_Hauptelemente.SelectedIndex = ListBox_Hauptelemente.Items.Count - 1;           
        }

        private void ListBox_Sitzung_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {

            Uebersicht_Unterlemente.ItemsSource = Liste_HauptElemente[ListBox_Hauptelemente.SelectedIndex].Liste_Elemente_1UE;
     
            //MessageBox.Show(Convert.ToString(ListBox_Sitzung.Items.Count));
        }

        private void daten_erfassen_Click(object sender, RoutedEventArgs e)
        {
            Liste_HauptElemente[ListBox_Hauptelemente.SelectedIndex].Liste_Elemente_1UE.Add(new UnterElement_1Ebene(eingabe1.Text,eingabe2.Text,eingabe3.Text));

        }

      
    }
}



ausblenden volle Höhe XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
<Window x:Class="Dart1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:Dart1"
        Title="MainWindow" Height="382" Width="849">
    <Window.Resources>
        <DataTemplate x:Key="Liste_HauptElemente" DataType="{x:Type local:Hauptpunkte}">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition />
                    <ColumnDefinition />
                    <ColumnDefinition />
                </Grid.ColumnDefinitions>
                <TextBlock Width="20" Grid.Column="0" Text="{Binding Path=id}"/>
                <TextBlock Width="90" Grid.Column="1" Text="{Binding Path=Name}"/>
                <TextBlock Width="20" Grid.Column="2" Text="{Binding Path=Folge}"/>
            </Grid>

        </DataTemplate>

        <DataTemplate x:Key="Ansicht_Unter_UnterElemente"  DataType="{x:Type local:UnterElement_2Ebene}">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition />
                   
                </Grid.ColumnDefinitions>
                <TextBlock Width="100"  Text="{Binding Path=w_string}" />
            </Grid>

        </DataTemplate>

        <DataTemplate x:Key="Ansicht_UnterElemente" DataType="{x:Type local:UnterElement_1Ebene}">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition />
                    <ColumnDefinition />
                    <ColumnDefinition />
                    <ColumnDefinition />
                </Grid.ColumnDefinitions>
                <TextBlock Width="100" Grid.Column="0" Text="{Binding Path=int_element}" />
                <TextBlock Width="100" Grid.Column="1" Text="{Binding Path=test}" />

                <ListBox Width="200" Grid.Column="2" ItemTemplate="{StaticResource Ansicht_Unter_UnterElemente}">
                    
                    
                </ListBox>
                <DataGrid Width="200" Height="50" Grid.Column="3" ItemTemplate="{StaticResource Ansicht_Unter_UnterElemente}"/>
            </Grid>
            
        </DataTemplate>


    </Window.Resources>
    <Grid>
        <Grid Height="332" Margin="10,10,5,0" VerticalAlignment="Top" >
            <Grid.RowDefinitions>
                <RowDefinition Height="50" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <Button Content="Neues Spiel" HorizontalAlignment="Left" Margin="10,18,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
            <ListBox x:Name="ListBox_Hauptelemente" HorizontalAlignment="Left" Height="259" Margin="10,10,0,-268" VerticalAlignment="Top" Width="133" Grid.Row="1" ItemTemplate="{StaticResource Liste_HauptElemente}" SelectionChanged="ListBox_Sitzung_SelectionChanged"/>
            <TextBox x:Name="TextBox_neuesSpiel" HorizontalAlignment="Left" Height="23" Margin="109,17,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"   />
            
            <ListBox x:Name="Uebersicht_Unterlemente" HorizontalAlignment="Left" Height="259" Margin="148,10,0,-143" Grid.Row="1" VerticalAlignment="Top" Width="355" ItemTemplate="{StaticResource Ansicht_UnterElemente}"/>
            
            <Label Content="Eingabe1" HorizontalAlignment="Left" Margin="540,40,0,-26" Grid.Row="1" VerticalAlignment="Top"/>
            <Label Content="Eingabe2" HorizontalAlignment="Left" Margin="540,71,0,-28" Grid.Row="1" VerticalAlignment="Top"/>
            <Label Content="Eingabe3" HorizontalAlignment="Left" Margin="540,102,0,-30" Grid.Row="1" VerticalAlignment="Top"/>
            <TextBox x:Name="eingabe1" HorizontalAlignment="Left" Height="23" Margin="607,40,0,0" Grid.Row="1" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"/>
            <TextBox x:Name="eingabe2" HorizontalAlignment="Left" Height="23" Margin="607,71,0,0" Grid.Row="1" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"/>
            <TextBox x:Name="eingabe3" HorizontalAlignment="Left" Height="23" Margin="607,102,0,-25" Grid.Row="1" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"/>
            <Button x:Name="daten_erfassen" Content="Daten erfassen" HorizontalAlignment="Left" Margin="540,152,0,-49" Grid.Row="1" VerticalAlignment="Top" Width="75" Click="daten_erfassen_Click"/>
          



        </Grid>

    </Grid>
</Window>


Moderiert von user profile iconChristian S.: C#- durch XML-Tags ersetzt
Einloggen, um Attachments anzusehen!
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: So 11.01.15 19:25 
Hallo,

du benutzt ja auch nirgendwo die Liste Liste_UE_2E. Bei der ersten Liste hast du ja wenigstens im ListBox-Ereignis die ItemsSource auf die Liste_Elemente_1UE gesetzt.

Besser ist es, (fast) komplett auf Codebehind-Ereignisse zu verzichten und nach dem MVVM-Prinzip mittels der DataContext-Eigenschaft die Bindung von View-Element und ViewModel herzustellen.

Du kannst natürlich auch ersteinmal genauso vorgehen wie bei deiner Unterelement-Liste und ein ListBox-Ereignis dafür benutzen.

Du kommst mit WPF aber besser zurecht (und auf lange Sicht auch schneller voran), wenn du MVVM konsequent verwendest.
Auch deine Implementierung der INotifyPropertyChanged-Schnittstelle ist noch nicht korrekt, da du bei jeder Änderung einer Eigenschaft OnPropertyChanged (mit dem passenden Eigenschaftennamen) aufrufen solltest.
Ab .NET 4.5 gibt es mit dem Attribut [CallerMemberName] sogar noch eine kürzere (und sichere) Variante beim Aufruf, s. Beispiel unter INotifyPropertyChanged.

PS. Deine Benennung der Eigenschaften ist sehr gewöhnungsbedürftig (Eigenschaften sollten mit einem Großbuchstaben beginnen).
Fritziiiii Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: So 11.01.15 20:14 
Hi,

danke schonmal für deine Hinweise. Aber wo und wie müßte ich die Liste "Liste_UE_2E" noch einbinden?
Ich vermute ja mal im DataTemplate "Ansicht_UnterElemente"? (Da ja aus diesem Template dann das "Untertemplate Ansicht_Unter_UnterElemente" aufgerufen wird.

Bei der Benennung der Eigenschaften gelobe ich Besserung!

Zum Thema MVVM: Wenn ich erstmal die Grundlagen von OOP & Co ein bisschen besser verstanden hab, dann gern. Aber derzeit möchte ich mich ein bißchen auf "mein" thema Listen mit Unterlisten beschränken, da ich sonst angst hab, kompett den Überblick zu verlieren.

Gruß
Fritziiiii
Fritziiiii Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Fr 16.01.15 15:17 
Hat keine einen Rat, wie man das Problem lösten kann???
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: Fr 16.01.15 16:57 
Hallo,

ich habe doch geschrieben:
Th69 hat folgendes geschrieben:
Du kannst natürlich auch ersteinmal genauso vorgehen wie bei deiner Unterelement-Liste und ein ListBox-Ereignis dafür benutzen.


ausblenden XML-Daten
1:
<ListBox x:Name="Uebersicht_Unterlemente" ... SelectionChanged="ListBox_Unterelemente_SelectionChanged"/>					

Schön ist das zwar nicht, aber das dürfte ersteinmal laufen.