Autor Beitrag
Christoph1972
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Fr 23.09.11 15:58 
Controls in einer DataTable, das hört sich etwas suspekt an :gruebel: . Data Templates und Binding ist in WPF eigentlich immer die bessere Lösung, als Controls im Code selbst zu erstellen.

_________________
>λ=
Christoph1972 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: Do 29.09.11 20:36 
So, jetzt hab ich es endlich.

Vielen Dank für den Tipp!

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: 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:
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:
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:
ausblenden 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:
ausblenden 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.
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: 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:

ausblenden 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