Laden...

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

Erstellt von dscNRW vor 2 Jahren Letzter Beitrag vor 2 Jahren 669 Views
D
dscNRW Themenstarter:in
30 Beiträge seit 2021
vor 2 Jahren
Binding an einen DataContext von einem DataGrid das an eine ItemsSource gebunden ist

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.

D
dscNRW Themenstarter:in
30 Beiträge seit 2021
vor 2 Jahren

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.

D
dscNRW Themenstarter:in
30 Beiträge seit 2021
vor 2 Jahren

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>

T
50 Beiträge seit 2010
vor 2 Jahren

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.

D
dscNRW Themenstarter:in
30 Beiträge seit 2021
vor 2 Jahren

@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. 🙂.