Autor |
Beitrag |
Christoph1972
      
Beiträge: 690
Erhaltene Danke: 16
VS2015 Pro / C# & VB.Net
|
Verfasst: Fr 23.09.11 15:50
Hallo Leute,
ist es möglich ein Control in einem DataGrid anzuzeigen? Ich habe in meiner Tabelle eine Splate als typeof(StackPanel) definiert. Das StackPanel enthält eine ImageBox und ein Label. Ich hatte gehofft, das die Values der Spalte im Grid angezeigt werden, das ist natürlich nicht der Fall.
Ich habe auch schon gegoogelt, da konnte ich jedoch nur Infos zu Images finden.
_________________ Gruß
Christoph
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Fr 23.09.11 15:58
Controls in einer DataTable, das hört sich etwas suspekt an  . Data Templates und Binding ist in WPF eigentlich immer die bessere Lösung, als Controls im Code selbst zu erstellen.
_________________ >λ=
|
|
Christoph1972 
      
Beiträge: 690
Erhaltene Danke: 16
VS2015 Pro / C# & VB.Net
|
Verfasst: Fr 23.09.11 16:33
Auf die Idee bin ich nur gekommen, weil das Grid seine Daten via Drag & Drop aus einer ListBox empfängt. Daher die Idee die ListBoxItems(StackPanel mit Image & Label) direckt als Value zu übernehmen.
_________________ Gruß
Christoph
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Fr 23.09.11 17:11
Wenn der Listbox-Eintrag dabei erhalten bleiben soll, kann das sowieso nicht funktionieren, weil jedes visuelle Element nur einen Parent haben kann. Aber so oder so wäre etwas Datentrennung doch sicher nicht verkehrt; im Idealfall würde beim Drop einfach das Model/ViewModel des ListBox-Items übernommen.
_________________ >λ=
|
|
Christoph1972 
      
Beiträge: 690
Erhaltene Danke: 16
VS2015 Pro / C# & VB.Net
|
Verfasst: Fr 23.09.11 17:19
Hi, das Item löse ich natürlich vom Parent vor der Übergabe. Meine Idee kann nicht so einfach umgesetzt werden, oder?
_________________ Gruß
Christoph
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Fr 23.09.11 19:06
Versuche es mal im Data Template mit einem ContentPresenter, an dessen Content Property du das StackPanel bindest, das sollte funktionieren.
_________________ >λ=
Für diesen Beitrag haben gedankt: Christoph1972
|
|
Christoph1972 
      
Beiträge: 690
Erhaltene Danke: 16
VS2015 Pro / C# & VB.Net
|
Verfasst: Do 29.09.11 20:36
So, jetzt hab ich es endlich.
Vielen Dank für den Tipp!
Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| <DataGridTemplateColumn Header="Sample" Width="150" IsReadOnly="True" > <DataGridTemplateColumn.CellTemplate > <DataTemplate> <ContentPresenter Content="{Binding ListBoxStackPanelItem}"> </ContentPresenter> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> |
_________________ Gruß
Christoph
|
|
Christoph1972 
      
Beiträge: 690
Erhaltene Danke: 16
VS2015 Pro / C# & VB.Net
|
Verfasst: Fr 24.08.12 16:17
Ich wollte das noch mal etwas vollständiger posten, da ich mir heute den Kopf zerbrochen habe wie ich das damals gemacht habe. Das DataBinding war mir nicht auf anhieb klar, da muss ich mich generell verbessern.......
Hier die Klasse (die vom StackPanel erbt) mit der ich die ListBoxItems erstelle:
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:
| public class ListBoxStackPanelItem : StackPanel { public ListBoxStackPanelItem(string name) { this.Orientation = Orientation.Horizontal; this.Height = 25; this.Width = 200;
this.Children.Add(ReadyImage()); this.Children.Add(TextLabel(name)); }
private Image ReadyImage() { Image image = new Image(); image.Width = 18; image.Height = 18; image.Stretch = Stretch.Fill;
image.Source = new BitmapImage(new Uri(@"Resources/ready.png", UriKind.RelativeOrAbsolute));
return image; }
private Label TextLabel(string text) { Label l = new Label(); l.FontSize = 14; l.Content = text;
return l; } } |
Dann erstelle ich eine Klasse die von DataTable erbt und erstelle gleich die Column für das ListBoxItem:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| public class TableTemplate : DataTable { public TableTemplate() { this.Columns.Add("Sample", typeof(ListBoxStackPanelItem)); this.Columns.Add("Message", typeof(string)); } } |
Hier das DataGrid, mit der definition der Columns und dem DataBinding:
XML-Daten 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| <Grid> <DataGrid ItemsSource="{Binding}" AutoGenerateColumns="False" Height="216" HorizontalAlignment="Left" Margin="146,22,0,0" Name="MyDataGrid" VerticalAlignment="Top" Width="346" > <DataGrid.Columns> <DataGridTemplateColumn Header="Sample" Width="150" IsReadOnly="True" > <DataGridTemplateColumn.CellTemplate > <DataTemplate> <ContentPresenter Content="{Binding Sample}"></ContentPresenter> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTextColumn Binding="{Binding Message}" Width="100" Header="TextColumn"></DataGridTextColumn> </DataGrid.Columns> </DataGrid> </Grid> |
Hier wir die DataTable zum Testen mit meinen "ListBoxItems" gefüllt, das kann natürlich alles mögliche sein.
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:
| public partial class MainWindow : Window { TableTemplate MyTable = new TableTemplate();
public MainWindow() { InitializeComponent();
MyDataGrid.DataContext = MyTable;
for (Int32 i = 1; i < 10; i++) { ListBoxStackPanelItem t = new ListBoxStackPanelItem(i.ToString());
MyListBox.Items.Add(t);
DataRow dr = MyTable.NewRow(); dr[0] = t; dr[1] = i.ToString() + " test bla";
MyTable.Rows.Add(dr); } } } |
Viel Spass damit!
_________________ Gruß
Christoph
|
|
Christoph1972 
      
Beiträge: 690
Erhaltene Danke: 16
VS2015 Pro / C# & VB.Net
|
Verfasst: Mi 29.08.12 17:06
Hallo Leute,
es ist noch ein „kleines“ Problem aufgetreten, ich denke es hat was mit dem ContentPresenter zu tun.
Und zwar, wenn ich ein Row, mit einem ListBoxStackPanelItem in die gebundene Tabelle einfüge, wird das Image des Items nicht angezeigt. Wenn jedoch ein Item via Drag&Drop aus einer ListBox eingefügt wird, dann schon. Ich habe nun rausgefunden das die Images erst im Grid angezeigt werden, wenn sie zuvor im Window sichtbar waren.
Zudem habe festgestellt, das einige Items nicht mehr sichtbar sind, wenn das Window so weit resized wurde das sie nicht mehr sichtbar waren.
Kann ich ein irgendwie ein neu zeichnen des angezeigten Bereichs erzwingen?
_________________ Gruß
Christoph
|
|
Christoph1972 
      
Beiträge: 690
Erhaltene Danke: 16
VS2015 Pro / C# & VB.Net
|
Verfasst: Do 30.08.12 22:15
Problem erkannt, Problem gebannt
Das Problem war die Auflösung vom Pfad des Images. Und zwar habe ich die Rows in einem anderen Projektordner erstellt und der Tabelle zugefügt. Der angabe des Pfades muss so aussehen:
C#-Quelltext 1:
| image.Source = new BitmapImage(new Uri(@"pack://application:,,,/Resources/bild.png", UriKind.RelativeOrAbsolute)); |
Schade, für solche Fälle würde ich mir eine Exception wünschen, das hat wieder viel Zeit gekostet.
Das "Problem" mit dem Resize besteht jedoch weiterhin, ist aber nicht wichtig.
_________________ Gruß
Christoph
|
|