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