I have a screen which has a Gridview and 2 heirarchies within it.
At the moment, I am using the RowEditEnded event of the GridView (and its embedded Grids) to perform updates. I am doing it in such a way which is not very MVVM. For example:
You can see there that I am casting the DataContext as a ViewModel.
I would prefer to bind directly to properties on the ViewModel in Xaml.
The current Xaml for that UserControl is:
<UserControl x:Class="TimeTracker.View.ManageProjectsView.ManageProjectsView"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.WPF4"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300"
DataContext="{Binding ManageProjects, Source={StaticResource Locator}}">
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="../../Skins/MainSkin.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<Grid>
<!-- This Border is just a container to provide the transparent effect as a layer above the clock-->
<Border Grid.Row="1" Height="Auto" Width="Auto">
<Grid Height="Auto" Width="Auto" Background="#990D0529">
<Border Padding="10" Margin="0" Width="630" Height="600" CornerRadius="10" BorderBrush="#FF3F3636"
BorderThickness="1" Background="{StaticResource TransparentBrush}">
<Border Padding="10" Height="450" Width="580" CornerRadius="10" BorderBrush="#FF3F3636" BorderThickness="1" Background="{StaticResource TransparentBrush}">
<Grid Height="Auto" Width="Auto" Background="#990D0529">
<telerik:RadGridView x:Name="ProjectsRadGridView" AutoGenerateColumns="False"
ColumnWidth="*" GridLinesVisibility="None" telerik:StyleManager.Theme="Transparent"
RowIndicatorVisibility="Collapsed" IsReadOnly="False"
ItemsSource="{Binding Path=Projects}"
RowEditEnded="ProjectsRadGridView_RowEditEnded">
<telerik:RadGridView.ChildTableDefinitions>
<telerik:GridViewTableDefinition />
</telerik:RadGridView.ChildTableDefinitions>
<telerik:RadGridView.Columns>
<telerik:GridViewDataColumn DataMemberBinding="{Binding Id}" Header="Project Id" UniqueName="Id" IsVisible="False" />
<telerik:GridViewDataColumn DataMemberBinding="{Binding ProjectName}" Header="Name" UniqueName="ProjectName" IsReadOnly="False"/>
<telerik:GridViewDataColumn DataMemberBinding="{Binding Visible}" Header="Visible" UniqueName="Visible" IsReadOnly="False" />
</telerik:RadGridView.Columns>
<telerik:RadGridView.HierarchyChildTemplate>
<DataTemplate>
<telerik:RadGridView x:Name="TasksRadGridView" BorderThickness="0,1,0,1"
telerik:StyleManager.Theme="Transparent"
RowEditEnded="TasksRadGridView_RowEditEnded"
GridLinesVisibility="None" CanUserFreezeColumns="False"
AutoGenerateColumns="False" ItemsSource="{Binding Tasks}"
ShowGroupPanel="False" IsReadOnly="False">
<telerik:RadGridView.ChildTableDefinitions>
<telerik:GridViewTableDefinition />
</telerik:RadGridView.ChildTableDefinitions>
<telerik:RadGridView.Columns>
<telerik:GridViewDataColumn DataMemberBinding="{Binding Id}" Header="Task ID" IsVisible="False" />
<telerik:GridViewDataColumn DataMemberBinding="{Binding TaskName, UpdateSourceTrigger=PropertyChanged}" Header="Name" />
<telerik:GridViewDataColumn DataMemberBinding="{Binding Description}" Header="Description" />
<telerik:GridViewDataColumn DataMemberBinding="{Binding Visible}" Header="Visible" />
</telerik:RadGridView.Columns>
<telerik:RadGridView.HierarchyChildTemplate>
<DataTemplate>
<telerik:RadGridView x:Name="WorkItemsRadGridView" BorderThickness="0,1,0,1"
telerik:StyleManager.Theme="Transparent"
RowEditEnded="WorkItemsRadGridView_RowEditEnded"
GridLinesVisibility="None" CanUserFreezeColumns="False"
AutoGenerateColumns="False" ItemsSource="{Binding WorkItems}"
ShowGroupPanel="False" IsReadOnly="False">
<telerik:RadGridView.Columns>
<telerik:GridViewDataColumn DataMemberBinding="{Binding Id}" Header="Work Item ID" IsVisible="False" />
<telerik:GridViewDataColumn DataMemberBinding="{Binding Duration}" Header="Duration" IsReadOnly="False" />
<telerik:GridViewDataColumn DataMemberBinding="{Binding Description}" Header="Description" IsReadOnly="False" />
<telerik:GridViewDataColumn DataMemberBinding="{Binding DateOfWork}" Header="DateOfWork" IsReadOnly="False" />
</telerik:RadGridView.Columns>
</telerik:RadGridView>
</DataTemplate>
</telerik:RadGridView.HierarchyChildTemplate>
</telerik:RadGridView>
</DataTemplate>
</telerik:RadGridView.HierarchyChildTemplate>
</telerik:RadGridView>
</Grid>
</Border>
</Border>
</Grid>
</Border>
</Grid>
</UserControl>
I think one part of the problem is that the embedded Grids are not binding to separate ViewModels. They are binding to the relevant property on the ViewModel:
e.g. the 1st embedded GridView is TasksRadGridView. It binds as so:
Is there a way to directly binding to the ViewModel, passing it the valie of the current ro being edited for the embedded grids?
I am familiar with the EventToCommand trigger of the MVVM Light Toolkit. I just can't find a way to extract the value for the current row being edited for items in the embedded Grids. The item would be sent as a parameter using the EventToCommand trigger (I think that is the best design).
Cheers
Cheers