Laden...

WPF DataBinding Verständnisproblem

Erstellt von Kriz vor 4 Jahren Letzter Beitrag vor 4 Jahren 778 Views
K
Kriz Themenstarter:in
141 Beiträge seit 2017
vor 4 Jahren
WPF DataBinding Verständnisproblem

Guten Morgen Freunde der Sonne!

Sorry für den Titel, mir ist leider nichts besseres eingefallen...

Folgende Situation:
Ich habe ein View mit (unter anderem) einem Datagrid. In meinem Viewmodel habe ich eine ObservableCollection<Person> welche als Source für das Datagrid dient.

class Schedule
{
    public string Name { get; set; }
    public string ShortSymbol { get; set; }
}
class Person
{
    public ObservableCollection<Schedule> plannedSchedule { get; set; }
}

Diese _ObservableCollection _hat wiederum eine ObservableCollection<Schedule> mit der ich im CodeBehind die Spalten für das Datagrid erstelle. Ja, sowas sollte nicht im CodeBehind gemacht werden. Da aber _plannedSchedule _immer eine andere Anzahl aufweist, wusste ich mir nicht besser zu helfen.

for (int i = 0; i <= Days-1; i++)
{
    DataGridTextColumn dataGridTextColumn = new DataGridTextColumn()
    {
        Header = MasterRota.StartDate.AddDays(i).ToString("dd.MM.", german),
        Binding = new Binding($"plannedSchedulesThisWeek[{i}]")
    };           
    DGrid.Columns.Add(dataGridTextColumn);
}

Bis hierhin funktioniert auch alles super. Die Spalten werden alle korrekt abgebildet und gegen als ToString() die property _Name _wieder.

Nun habe ich mir einen Trigger gebastelt, der unter bestimmten Voraussetzungen dafür sorgen soll, dass nicht die Name Property, sondern die _ShortSymbol _Property wieder gibt. Und hier komme ich nicht weiter:

<DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.UseShortSymbol}" Value="true">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type DataGridCell}">
                <Grid Background="{TemplateBinding Background}">
                    <ContentPresenter HorizontalAlignment="Center" Content="{Binding ShortSymbol}"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</DataTrigger>

Es wird mir der Fehler angezeigt, dass die Klasse Person keine Eigenschaft ShortSymbol besitzt, was ja richtig ist. Aber das Binding ist doch auf ein plannedSchedule, nicht auf Person?!? Wie komme ich an das richtige Binding um auf das korrekte plannedSchedule.ShortSymbol zuzugreifen?

5.658 Beiträge seit 2006
vor 4 Jahren

Wir können leider von hier aus nicht sehen, was für Daten hinter deinem Binding stecken, da fehlt der entscheidende Teil. Du könntest es per Debugger herausfinden ([Artikel] MVVM und DataBinding, Abschnitt Debugging), aber das wäre einfacher, wenn du MVVM verwenden würdest.

Ja, sowas sollte nicht im CodeBehind gemacht werden. Da aber plannedSchedule immer eine andere Anzahl aufweist, wusste ich mir nicht besser zu helfen.

Verstehe ich nicht. Du kannst doch deine ViewModels so organisieren, daß die Daten so zur Verfügung stehen, wie sie präsentiert werden sollen. Wenn du die Bindings nicht im XAML definieren kannst, hast du die ViewModels falsch strukturiert.

Du brauchst übrigens für die Umschaltung zwischen den beiden Ansichten nicht unbedingt zwei ControlTemplates zu definieren. Es gibt andere Möglichkeiten: die Umschaltung kann direkt in der ViewModel-Eigenschaft erfolgen, oder man blendet eine Anzeige per Visibility ein, und die andere aus ([Artikel] MVVM und DataBinding, Strg-F "BoolToVisibilityConverter")

Weeks of programming can save you hours of planning