Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Binding an einen DataContext von einem DataGrid das an eine ItemsSource gebunden ist
dscNRW
myCSharp.de - Member



Dabei seit:
Beiträge: 21

Themenstarter:

Binding an einen DataContext von einem DataGrid das an eine ItemsSource gebunden ist

beantworten | zitieren | melden

Hallo zusammen,

ich habe ein DataGrid das an ein ViewModel bzw. an ein Property eines ViewModels gebunden ist:


<DataGrid IsReadOnly="True" AutoGenerateColumns="False" Background="#2D2D30" x:Name="dgSearch" ItemsSource="{Binding BookingsModel.Bookings, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">

Innerhalb des Grids gibt's eine Spalte mit einem Button um Details in einem eigenen Window darzustellen.

   <DataGridTemplateColumn Header="Show Informations">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <Button Style="{StaticResource Flat}" Command="{Binding Path=OpenSingleBookingInfo, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type vm:MoneyModel}}}" CommandParameter="{Binding ElementName=dgOverview, Path=SelectedItem.ID}">
                                    <Image Source="\images\Ok-icon.png" Width="16" Height="16"/>
                                </Button>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>

Das Command kann aber nicht ausgeführt werden und ich weiß nicht warum.

Ich habe innerhalb des MoneyModels ein Property auf das BookingsModel - das funktioniert in der Regel auch wirklich gut - aber jetzt auf dieser Ebene wird es schwierig. Und ich möchte den Umweg über ein CodeBehind in der Page bzw. in der Form unbedingt vermeiden. Vielleicht ist meine Denkweise auch die Falsche.....

Hat jemand einen Denkanstoß?

Groetjes,
d.
private Nachricht | Beiträge des Benutzers
dscNRW
myCSharp.de - Member



Dabei seit:
Beiträge: 21

Themenstarter:

beantworten | zitieren | melden

Ich habe auch schon folgendes versucht:


                                            <i:InvokeCommandAction Command="{Binding Mode=TwoWay, Path=Bookings, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type vm:Money}}}" CommandParameter="{Binding ElementName=dgOverview, Path=SelectedItem.ID}"/>



Sprich das zugreifende Model geändert.....hat aber nichts gebracht :-(.

Groetjes,
d.
private Nachricht | Beiträge des Benutzers
dscNRW
myCSharp.de - Member



Dabei seit:
Beiträge: 21

Themenstarter:

beantworten | zitieren | melden

Hallo zusammen,

ich habe es hinbekommen. So schwer war's nicht:


       <i:Interaction.Triggers>
                                        <i:EventTrigger EventName="Click">
                                            <i:InvokeCommandAction Command="{Binding RelativeSource={RelativeSource AncestorType=Page, Mode=FindAncestor}, Path=DataContext.Buchungen.OpenSingleBookingInfo }" CommandParameter="{Binding ElementName=dgSearch, Path=SelectedItem}" />
                                        </i:EventTrigger>
                                    </i:Interaction.Triggers>

private Nachricht | Beiträge des Benutzers
teebeast
myCSharp.de - Member



Dabei seit:
Beiträge: 46
Herkunft: Bayern

beantworten | zitieren | melden

Hi,

wir haben in unseren Projekten immer mal wieder das Problem, dass wir nicht auf Eigenschaften des DataContextes in DataTemplates zugreifen können. Wir nutzen hier eine Hilfsklasse, um das umsetzen zu können. Haben wir irgendwann mal entdeckt und ist recht hilfreich.


/// <summary> Bindet den DataContext gegen Elemente, die nicht im Visual-Tree auftauchen </summary>
public sealed class DataContextBinder : Freezable
{
    /// <summary> Dependency-Property von <see cref="DataContext"/> </summary>
    public static readonly DependencyProperty DataContextProperty =
        DependencyProperty.Register(nameof(DataContext),
            typeof(object),
            typeof(DataContextBinder),
            new PropertyMetadata(null));

    /// <summary> zu bindende DataContext </summary>
    public object DataContext
    {
        get { return GetValue(DataContextProperty); }
        set { SetValue(DataContextProperty, value); }
    }

    /// <summary> Erzeugt eine neue Instanz von <see cref="DataContextBinder"/> </summary>
    protected override Freezable CreateInstanceCore()
        => new DataContextBinder();
}

Definition in der XAML-Datei:

<Window.Resources>
    <utils:DataContextBinder x:Key="DataContextBinder" DataContext="{Binding}"/>
</Window.Resources>

Verwendung:


<DataTemplate>
    <TextBox Text="{Binding Source={StaticResource DataContextBinder}, Path=DataContext.TextProperty}"  />
</DataTemplate>

Vielleicht ist es ja mal nützlich.
private Nachricht | Beiträge des Benutzers
dscNRW
myCSharp.de - Member



Dabei seit:
Beiträge: 21

Themenstarter:

beantworten | zitieren | melden

@teebeast: Braucht es ja gar nicht, wenn man auf die RelativeSource einen Zugriff hat. Dann passt das - siehe meinen Beitrag etwas weiter oben :-),

Aber deinen Beitrag habe ich mir gerne für die Verständnis mitgenommen - das könnte einiges vereinfachen; werde das mal testen. :-).
private Nachricht | Beiträge des Benutzers