Laden...

Auf Control in ControlTemplate zugreifen (Code Behind)

Erstellt von Maliko vor 9 Jahren Letzter Beitrag vor 9 Jahren 3.197 Views
M
Maliko Themenstarter:in
117 Beiträge seit 2012
vor 9 Jahren
Auf Control in ControlTemplate zugreifen (Code Behind)

Hoi,

ich bin jetzt bereits schon die ganze Woche am suchen und finde einfach nix was mir da weiterhelfen könnte. Und zwar möchte ich über die xaml.cs-Datei an eine CollectionViewSource herankommen, welche sich im Resource-Bereich eines Grids befindet, welches sich wiederrum in einem ContentTemplate in einem ResourceDictionary befindet. Die CodeBehind-Datei gehört zur ResourceDatei.

Ich habs zwar schon geschafft an die CollectionViewSource zu kommen, aber aus irgendeinem Grund ist die leer (sprich CollectionViewSource.View ist null). Kann mir vielleicht jemand sagen, ob ich das ganze falsch angehe und mir vielleicht nen Ansatz nennen, wie es richtig sein müsste? Bei Google finde ich irgendwie nix dazu.

So versuche ich es derzeit:


ControlTemplate template = this["LeistungserbringerVertraegeTemplate"] as ControlTemplate;
            
Grid grid = template.LoadContent() as Grid;
//ListBox box = grid.FindName("lb_Vertraege") as ListBox;

CollectionViewSource viewSource = grid.FindResource("VertraegeSource") as CollectionViewSource;

viewSource.SortDescriptions.Clear();
viewSource.SortDescriptions.Add(new System.ComponentModel.SortDescription("VertragsID", System.ComponentModel.ListSortDirection.Ascending));

viewSource.View.Refresh();


<Grid>
    <Grid.Resources>
        <CollectionViewSource Source="{Binding Path=Vertraege}" x:Key="VertraegeSource">
            <CollectionViewSource.SortDescriptions>
                <scm:SortDescription PropertyName="Vertrag.Gruppe.ID" Direction="Ascending" />
            </CollectionViewSource.SortDescriptions>
        </CollectionViewSource>
    </Grid.Resources>

    [...]

    <ListBox Name="lb_Vertraege" Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="3" ItemTemplate="{StaticResource VertragsListBoxTemplate}" ItemsSource="{Binding Source={StaticResource VertraegeSource}}" ScrollViewer.VerticalScrollBarVisibility="Visible" />
</Grid>

Vielen Dank euch schon mal im Voraus.

Lg
Maliko

2.207 Beiträge seit 2011
vor 9 Jahren

Hallo Maliko,

wenn du schon Databinding verwendet...wieso willst du im CodeBehind noch sowas anstellen?

Gruss

Coffeebean

M
Maliko Themenstarter:in
117 Beiträge seit 2012
vor 9 Jahren

Das Problem das ich habe ist, das ich eine ListBox und kein DataGrid oder GridView verwende und daher die Überschriften (ich missbrauche die ListBox als Grid) Labels sind. Mit einem Klick auf das Label soll allerdings nach der entsprechenden Spalte sortiert werden.

Der C#-Code steht im MousLeftButtonUp-Event des Labels.

5.658 Beiträge seit 2006
vor 9 Jahren

Hi Maliko,

meiner Meinung nach mißbrauchst du nicht nur die Steuerelemente, sondern überhaupt WPF 😕

Dein Anwendungsfall ist, wenn ich es richtig verstanden habe, eine Liste mit Objekten nach unterschiedlichen Eigenschaften zu sortieren. Wenn du dafür (wie du selbst schreibst) eine Woche benötigst und dann per CodeBehind auf Templates zugreifen mußt, hast du irgendetwas Grundlegendes nicht verstanden.

Meine Tips wären: Verwende die Steuerelemente, die deinen Anforderungen entsprechen, also z.B. ein DataGrid. Verwende MVVM, dann kannst du mit ViewModels, ObservableCollections und Commands arbeiten, anstatt mit solchen Konstrukten wie in deinem Beispielcode.

Christian

Weeks of programming can save you hours of planning

M
Maliko Themenstarter:in
117 Beiträge seit 2012
vor 9 Jahren

Ich würde das DataGrid gerne nutzen, dies ist allerdings nicht möglich, da ich im Grid ein weiteres Grid anzeige, welches über alle Zeilen geht (sprich ich hab eine Zeile als Grid, und darunter ein weiteres Grid).

Davon mal abgesehen arbeite ich erst ne Woche mit WPF (ich komme aus dem WinForms-Sektor).

D
500 Beiträge seit 2007
vor 9 Jahren

Hi Maliko,

das Szenario, welches Du beschreibst hoert sich nach Master-Detail DataGrid an. Schau mal hier, ob das was fuer Dich ist: Master-Detail-Wpf

Gruss,
DaMoe