DataGrid RowDetails Daten hinzufügen

Gast #3163712
Lesenswert?
• ▲
▼
Hallo.

Ich benötige einen Ansatz um folgende Aufgabe zu lösen.

Ich habe ein DataGrid (das Neue, ab 4.0), welches ich über eine
ObservableCollection<Klasse> füllen lasse. Das funktioniert tadellos.

In diesem DataGrid werden Dateien aufgelistet.
Mit einem Doppelklick auf die entsprechende Datei im Datagrid wird ein 
Wert aus dieser Datei extrahiert (das funktioniert) und im Normalfall in 
eine Variable gespeichert.
Nun soll dieser Wert in den DataGrid RowDetails angezeigt werden.
Und hier komme ich nicht weiter.

Wie bekomme ich den Wert in die RowDetail-Anzeige, da ich keinen 
direkten Zugrif auf die Rowdetails habe. Und mit der bestehenden Binding 
komme ich irgendwie nicht weiter, da das Binding des Datagrids ja schon 
zur "anderen" Klasse der -ObservableCollection<Klasse> -gehört.

Bitte um einen Gedankenanstoss.
Danke im Voraus.

MikroMakro
Gast #3177390
Lesenswert?
• ▲
▼
Hallo Frieder S, Danke für deinen Beitrag.
Mhm.. so einfach hatte ich nicht gedacht. :(

Ich habe nun ein paar Tage hin und her probiert.
Ich kann dem eingefügten Propertie einen Wert zuweisen und auch abrufen.
Das RowDetail ist, denke ich, soweit an das Propertie gebunden.
Leider erscheint der Wert nicht in den RowDetails.
Weise ich dem Propertie in der Klasse getFolterInfo gleich einen Wert 
zu, so wird er in den RowDetails angezeigt.

Es geht um den Wert von "SizeMax"

Hier ein Teil des XAML-Codes.

1
    <Grid>
2
        <DataGrid AutoGenerateColumns="False" Name="dataGrid">
3
            <DataGrid.RowDetailsTemplate>
4
                <DataTemplate>
5
                    <StackPanel Orientation="Vertical" >
6
                        <StackPanel Orientation="Horizontal">
7
                            <Label Content="SizeMAX" Width="100"/>
8
                            <Label Content="{Binding Path=SizeMax}" Width="100"/>
9
                        </StackPanel>
10
                    </StackPanel>
11
                </DataTemplate>
12
            </DataGrid.RowDetailsTemplate>
13
        </DataGrid>
14
    </Grid>

.
.
.

Hier des Viewmodels
1
public class getFolderInfo : INotifyPropertyChanged
2
    {
3

4
       
5

6
        private string _ID;
7
        private string _Datum;
8
        
9
      
10

11
        public getFolderInfo(string Lot_ID, string CreationDate)
12
        {
13
            // TODO: Complete member initialization
14
            this._ID = ID;
15
            this._Datum = CreationDate;
16
       
17

18
        
19
        }
20

21
        public string ID
22
        {
23
            get { return _ID; }
24
            set { _ID = value; }
25
        }
26

27
        public string CreationDate
28
        {
29
            get { return _Datum; }
30
            set { _Datum = value; }
31
        }
32

33

34
        public event PropertyChangedEventHandler PropertyChanged;
35
        private string _SizeMax;
36

37

38
        
39
        public getFolderInfo(string SizeMax)
40
        {
41
            this._SizeMax = SizeMax;
42
        }
43
          
44

45
        public string SizeMax
46
        {
47
            get { return _SizeMax; }
48
            set
49
            {
50
                if (_SizeMax == value)
51
                {
52
                    return;
53
                }
54
                _SizeMax = value;
55
                OnPropertyChanged("SizeMax");
56
            }
57
        }
58

59
        private void OnPropertyChanged(string p)
60
        {
61
            PropertyChangedEventHandler handler = PropertyChanged;
62
            if (handler != null) { handler(this, new PropertyChangedEventArgs(p)); }
63
        }      
64
    }
65

66
     
67

68
    public class Folders : ObservableCollection<getFolderInfo>
69
    {
70
        DirectoryInfo ResultDirectory = new DirectoryInfo(@"d:/log/");
71
       
72
        public Folders()
73
            : base()
74
        {
75
            foreach (DirectoryInfo di in ResultDirectory.GetDirectories())
76
            {            
77
                Add(new getFolderInfo(di.ToString(), di.CreationTime.ToString()));
78
            }
79
        }             
80
    }
81
}


Muss das Datagrid noch ein Update erfahren?
Íst das INotifyPropertyChanged hier richtig?

Danke im Voraus.
#3177536
Lesenswert?
• ▲
▼
Ich bin auch kein WPF-Experte, aber ich versuch mal zu helfen so gut es 
geht:

Setzt du auch irgendwo den DataContext für dein DataGrid?
Das Grid muss ja wissen, wo es nach dem Property "SizeMax" suchen soll.

Machst du die Zuweisung der Daten von der ObservableCollection zum 
DataGrid einmalig, manuell im Code Behind?
Das würde erklären warum die Änderungen nicht angezeigt werden, oder was 
meinst du damit:

> Weise ich dem Propertie in der Klasse getFolterInfo gleich einen Wert
> zu, so wird er in den RowDetails angezeigt.

gleich zuweisen = im Konstruktor des MainWindow?
Gast #3179179
Lesenswert?
• ▲
▼
>Setzt du auch irgendwo den DataContext für dein DataGrid?
>Das Grid muss ja wissen, wo es nach dem Property "SizeMax" suchen soll.

Ich hatte den Aufbau des Datagrids und die ItemSource im Code Behind 
relasiert.
1
dataGrid.ItemsSource = new Folders();
(wird einmal im MainWindow ausgeführt)

>Machst du die Zuweisung der Daten von der ObservableCollection zum
>DataGrid einmalig, manuell im Code Behind?

Was meinst du damit? Das Füllen des Datagrids?
-> das passiert ja in:
1
public class Folders : ObservableCollection<getFolderInfo>

Oder meinst du die Wertzuweisung für SizeMax?
Den Wert von SizeMax weise ich einmal zu.
Im dataGrid.SelectionChanged - Ereignis bzw. im 
dataGrid.MouseDoubleClick - Ereignis


> Weise ich dem Propertie in der Klasse getFolterInfo gleich einen Wert
> zu, so wird er in den RowDetails angezeigt.

>gleich zuweisen = im Konstruktor des MainWindow?

Damit hatte ich gemeint, dass ich in der Klasse getFolderInfo hier:
1
 private string _SizeMax = 100;
zuweise, um zu testen, dass der Wert in den Rowdetails angezeigt wird.
Das funktioniert. Nur eben nicht , wenn ich den Wert über
1
dataGrid.SelectionChanged - Ereignis bzw. im dataGrid.MouseDoubleClick - Ereignis
 zuweise. :(

Somit will ich erreichen, dass erst bei anklicken des gewählten 
DataGridItems die damit verbundene Datei bearbeitet wird und der Wert 
für SizeMax zugewiesen und angezeigt wird.
#3179210
Lesenswert?
• ▲
▼
Ok. Aber wenn du nur die ItemsSource für das DataGrid festlegst stimmt 
doch der DataContext trotzdem noch nicht, oder?
Und mit
1
dataGrid.ItemsSource = new Folders();
 weist du ja nur eine lokale Instanz als Quelle für das DataGrid zu.

Eigentlich müsste es doch so gehen (im MainWindow):
1
private Folders folders = new Folders(); 
2

3
public MainWindow()
4
{
5
    InitializeComponent();
6
    ...
7
    dataGrid.DataContext = folders;
8
    dataGrid.ItemsSource = fodlers; 
9
    ...
10
}
Gast #3179581
Lesenswert?
• ▲
▼
mhm... ok soweit so gut :)
1
folders.Add(new getFolderInfo(100.3));

Hiermit kann ich eine neue Zeile im Datagrid erzeugen mit einem Wert für 
SizeMax in den RowDetails.
Nun muss es nur noch für die selektierte Zeile/Item erfolgen.
Hast du da noch eine Idee?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren