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
> (das Neue, ab 4.0)
Ach so, das neue meinst du?
Jetzt fehlt nur noch die Programmiersprache, das Betriebssystem und
andere unwichtige Nebensächlichkeiten...
Upps, sorry.
C#, WPF, Windows7
>"das Neue" siehe: [[Beitrag "C# DataGridView löst DataGrid ab und umgekehrt. Wie denn nun?"]]
Welche Angaben wären noch wichtig?
Warum fügst du der Klasse die in deiner ObservableCollection gelistet wird nicht ein Property hinzu, in dem der Wert abgelegt wird? Anschließend kannst du einfach in deinem RowDetailsTemplate an dieses Property binden.
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.
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?
>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.
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 | } |
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?
Du musst ja kein neues Item hinzufügen. Im SelctionChanged Event kannst du ja folgendes machen:
1 | folders[dataGrid.SelectedIndex].SizeMax = 100.3; |
(Ich hab das jetzt nicht getestet)
Oh man! Ich weiß gar nicht wie ich Dir danken soll. So funktioniert es, wie ich es haben will. Danke! Da fehlen mir echt noch´n paar Basics.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.