I am using a RadGridView to display some data in a hierarchy. I am using MvvM so I am building by grid in XAML and have very little code behind.
I have a very simple hierarchy where I have a list of objects (Agents) and each agent can have a list of sub agents and a list of clients. These lists are two separate properties of my agent object, i.e. Agent.Agents and Agent.ClientAccounts. An agent can have a list of clients and a list of sub agents so when the user expands an agent row they will see two child grids at the same level in the hierarchy.
I am using the grid_RowLoaded event to only allow expanding when I have either a list of SubAgents or a list of Clients.
My issue is that when one of the lists of either SubAgents or Clients doesn’t have any records I would like to hide the grid (or not even create it in the first place)
I have tried to set the visibility of the SubAgents and Clients grids by using a converter so the grids are hidden when the lists have a count of 0 but that didn’t work
Any ideas would be much appreciated
Here is the structure of my grid
<telerik:RadGridView x:Name="grid" BorderThickness="0" Background="Transparent" ShowGroupPanel="False" IsReadOnly="True" DataContext="{Binding}" ItemsSource="{Binding Path=AgentList}" RowIndicatorVisibility="Collapsed" GridLinesVisibility="None" telerik:Theming.Theme="{DynamicResource TelerikThemeName}" IsSynchronizedWithCurrentItem="True" ShowColumnHeaders="True" AutoGenerateColumns="False" acb:CommandBehavior.Event="MouseDoubleClick" acb:CommandBehavior.Command="{Binding OpenAgentDetailsCommand}" acb:CommandBehavior.CommandParameter="{Binding RelativeSource={RelativeSource Self}, Path=SelectedItem.CustomerId}" RowLoaded="grid_RowLoaded"> <telerik:RadGridView.ChildTableDefinitions> <telerik:GridViewTableDefinition/> </telerik:RadGridView.ChildTableDefinitions> <telerik:RadGridView.Columns> <telerik:GridViewDataColumn DataMemberBinding="{Binding AccountId}" Header="Account Id" Width="Auto" /> <telerik:GridViewDataColumn DataMemberBinding="{Binding CustomerId}" Header="CustomerId" Width="Auto" /> <telerik:GridViewDataColumn DataMemberBinding="{Binding FirstName}" Header="FirstName" Width="Auto"/> <telerik:GridViewDataColumn DataMemberBinding="{Binding LastName}" Header="LastName" Width="Auto"/> <telerik:GridViewDataColumn DataMemberBinding="{Binding Volume}" Header="Volume" Width="Auto" DataFormatString="{}{0:N0}"/> </telerik:RadGridView.Columns> <telerik:RadGridView.HierarchyChildTemplate> <DataTemplate> <StackPanel> <!--sub agents--> <telerik:RadGridView ItemsSource="{Binding Path=Agents}" AutoGenerateColumns="False" ShowGroupPanel="False" Visibility="{Binding Path=Agents.Count, Converter={StaticResource countToVisibleConverter}}"> <telerik:RadGridView.Columns> <telerik:GridViewDataColumn DataMemberBinding="{Binding AccountId}" Header="Account Id" Width="Auto" /> <telerik:GridViewDataColumn DataMemberBinding="{Binding CustomerId}" Header="CustomerId" Width="Auto" /> <telerik:GridViewDataColumn DataMemberBinding="{Binding FirstName}" Header="FirstName" Width="Auto"/> <telerik:GridViewDataColumn DataMemberBinding="{Binding LastName}" Header="LastName" Width="Auto"/> <telerik:GridViewDataColumn DataMemberBinding="{Binding Volume}" Header="Volume" Width="Auto" DataFormatString="{}{0:N0}"/> </telerik:RadGridView.Columns> <telerik:RadGridView.ChildTableDefinitions> <telerik:GridViewTableDefinition /> </telerik:RadGridView.ChildTableDefinitions> <!--sub agents : clients--> <telerik:RadGridView.HierarchyChildTemplate> <DataTemplate> <telerik:RadGridView ItemsSource="{Binding Path=ClientAccounts}" AutoGenerateColumns="False" ShowGroupPanel="False" Visibility="{Binding Path=ClientAccounts.Count, Converter={StaticResource countToVisibleConverter}}"> <telerik:RadGridView.Columns> <telerik:GridViewDataColumn DataMemberBinding="{Binding AccountId}" Header="Account Id" Width="Auto" /> <telerik:GridViewDataColumn DataMemberBinding="{Binding FirstName}" Header="FirstName" Width="Auto"/> <telerik:GridViewDataColumn DataMemberBinding="{Binding LastName}" Header="LastName" Width="Auto"/> <telerik:GridViewDataColumn DataMemberBinding="{Binding Volume}" Header="Volume" Width="Auto" DataFormatString="{}{0:N0}"/> </telerik:RadGridView.Columns> </telerik:RadGridView> </DataTemplate> </telerik:RadGridView.HierarchyChildTemplate> </telerik:RadGridView> <!--clients--> <telerik:RadGridView ItemsSource="{Binding Path=ClientAccounts}" AutoGenerateColumns="False" ShowGroupPanel="False" Visibility="{Binding Path=ClientAccounts.Count, Converter={StaticResource countToVisibleConverter}}"> <telerik:RadGridView.Columns> <telerik:GridViewDataColumn DataMemberBinding="{Binding AccountId}" Header="Account Id" Width="Auto" /> <telerik:GridViewDataColumn DataMemberBinding="{Binding FirstName}" Header="FirstName" Width="Auto"/> <telerik:GridViewDataColumn DataMemberBinding="{Binding LastName}" Header="LastName" Width="Auto"/> <telerik:GridViewDataColumn DataMemberBinding="{Binding Volume}" Header="Volume" Width="Auto" DataFormatString="{}{0:N0}"/> </telerik:RadGridView.Columns> </telerik:RadGridView> </StackPanel> </DataTemplate> </telerik:RadGridView.HierarchyChildTemplate> </telerik:RadGridView>
<Window x:Class="GridviewDataTemplateFocusExample.MainWindow" xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" xmlns:GridviewDataTemplateFocusExample="clr-namespace:GridviewDataTemplateFocusExample" Title="MainWindow" Height="350" Width="525"> <Window.Resources> <DataTemplate x:Key="DetailView" > <GridviewDataTemplateFocusExample:DetailView /> </DataTemplate> </Window.Resources> <Grid> <telerik:RadGridView HorizontalAlignment="Stretch" Name="radGridView1" VerticalAlignment="Stretch" ItemsSource="{Binding MyData}" AutoGenerateColumns="False" CanUserInsertRows="True" RowIndicatorVisibility="Collapsed" CanUserDeleteRows="False" ShowInsertRow="True" ShowGroupPanel="False" IsSynchronizedWithCurrentItem="True" AddingNewDataItem="radGridView1_AddingNewDataItem" LoadingRowDetails="radGridView1_LoadingRowDetails" RowDetailsVisibilityMode="Collapsed" RowDetailsTemplate="{StaticResource DetailView}" > <telerik:RadGridView.Columns> <telerik:GridViewToggleRowDetailsColumn/> <telerik:GridViewDataColumn Header="Title" Width="250" DataMemberBinding="{Binding Name}" UniqueName="TitleColumn"/> </telerik:RadGridView.Columns> </telerik:RadGridView> </Grid></Window>using System;using System.Windows;using System.Windows.Input;using Telerik.Windows.Controls.GridView;namespace GridviewDataTemplateFocusExample{ /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { this.DataContext = new MainWindowVM(); InitializeComponent(); } private void radGridView1_AddingNewDataItem(object sender, Telerik.Windows.Controls.GridView.GridViewAddingNewEventArgs e) { (this.DataContext as MainWindowVM).AddNewDataObject(); radGridView1.CommitEdit(); var gridView = e.OwnerGridViewItemsControl; gridView.ScrollIntoViewAsync(gridView.Items[gridView.Items.Count - 1], //the row gridView.Columns[1], //the column new Action<FrameworkElement>((f) => { var row = f as GridViewRow; if (row != null) { row.IsSelected = true; row.DetailsVisibility = Visibility.Visible; } })); e.Cancel = true; } private void radGridView1_LoadingRowDetails(object sender, Telerik.Windows.Controls.GridView.GridViewRowDetailsEventArgs e) { Keyboard.Focus((e.DetailsElement as DetailView).tbxTitle); } }}using System.Collections.ObjectModel;namespace GridviewDataTemplateFocusExample{ public class MainWindowVM { public ObservableCollection<DataObject> MyData { get; set; } public MainWindowVM() { MyData = new ObservableCollection<DataObject>(); MyData.Add(new DataObject("Test 1")); MyData.Add(new DataObject("Test 2")); MyData.Add(new DataObject("Test 3")); MyData.Add(new DataObject("Test 4")); MyData.Add(new DataObject("Test 5")); } public void AddNewDataObject() { MyData.Add(new DataObject("Test ??????")); } } public class DataObject { public DataObject(string name) { Name = name; } public string Name { get; set; } }}<UserControl x:Class="GridviewDataTemplateFocusExample.DetailView" xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300"> <Grid> <Grid FocusManager.FocusedElement="{Binding ElementName=tbxTitle}" FocusManager.IsFocusScope="True"> <Border BorderThickness="2" Margin="3" BorderBrush="Black" CornerRadius="12" Padding="5" Background="Transparent" HorizontalAlignment="Stretch" > <telerik:RadTabControl Margin="2" BackgroundVisibility="Hidden" HorizontalAlignment="Stretch" > <telerik:RadTabItem Header="Details" > <Grid Width="Auto" HorizontalAlignment="Stretch" Background="Transparent" Margin="5" > <Grid.RowDefinitions> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <TextBlock Text="Name: " Margin="0,5,0,5" FontWeight="Bold" Grid.Row="0" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Left" Focusable="False"/> <TextBox Name="tbxTitle" Text="{Binding Name}" Margin="0,5,0,5" Grid.Row="0" Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Stretch" Focusable="true" /> </Grid> </telerik:RadTabItem> <telerik:RadTabItem Header="Page 2" > </telerik:RadTabItem> <telerik:RadTabItem Header="Page 3" > </telerik:RadTabItem> </telerik:RadTabControl> </Border> </Grid> </Grid></UserControl>
Is there any easy way to use style from filtering list (e.g in grid view filter - first picture) as default style for all scroll viewers (second picture)
Thanks for help.
using System;using System.Collections;using System.Collections.ObjectModel;using System.Windows;using System.Windows.Controls;using System.Windows.Media;using Telerik.Windows.Controls.DragDrop;namespace RadDragDrop2{ /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public ObservableCollection<CheckableItemsViewModel> List1 { get; set; } public ObservableCollection<CheckableItemsViewModel> List2 { get; set; } public MainWindow() { InitializeComponent(); List1 = new ObservableCollection<CheckableItemsViewModel>(); List2 = new ObservableCollection<CheckableItemsViewModel>(); LayoutRoot.DataContext = this; listBox1.AddHandler(RadDragAndDropManager.DropQueryEvent, new EventHandler<DragDropQueryEventArgs>(OnDropQuery)); listBox1.AddHandler(RadDragAndDropManager.DragQueryEvent, new EventHandler<DragDropQueryEventArgs>(OnDragQuery)); listBox1.AddHandler(RadDragAndDropManager.DropInfoEvent, new EventHandler<DragDropEventArgs>(OnDropInfo)); listBox1.AddHandler(RadDragAndDropManager.DragInfoEvent, new EventHandler<DragDropEventArgs>(OnDragInfo)); listBox2.AddHandler(RadDragAndDropManager.DropQueryEvent, new EventHandler<DragDropQueryEventArgs>(OnDropQuery)); listBox2.AddHandler(RadDragAndDropManager.DragQueryEvent, new EventHandler<DragDropQueryEventArgs>(OnDragQuery)); listBox2.AddHandler(RadDragAndDropManager.DropInfoEvent, new EventHandler<DragDropEventArgs>(OnDropInfo)); listBox2.AddHandler(RadDragAndDropManager.DragInfoEvent, new EventHandler<DragDropEventArgs>(OnDragInfo)); List1.Add(new CheckableItemsViewModel() { Name = "one", IsChecked = true }); List1.Add(new CheckableItemsViewModel() { Name = "two", IsChecked = false }); List1.Add(new CheckableItemsViewModel() { Name = "three", IsChecked = true }); List2.Add(new CheckableItemsViewModel() { Name = "four", IsChecked = false }); List2.Add(new CheckableItemsViewModel() { Name = "five", IsChecked = true }); List2.Add(new CheckableItemsViewModel() { Name = "six", IsChecked = false }); } private void OnDragQuery(object sender, DragDropQueryEventArgs e) { if (e.Options.Status == DragStatus.DragQuery) { var draggedItem = e.Options.Source; e.QueryResult = true; e.Handled = true; // Create Drag and Arrow Cue ContentControl dragCue = new ContentControl(); dragCue.Content = draggedItem.DataContext; dragCue.ContentTemplate = this.Resources["DragCueTemplate"] as DataTemplate; e.Options.DragCue = dragCue; e.Options.ArrowCue = RadDragAndDropManager.GenerateArrowCue(); // Set the payload (this is the item that is currently dragged) e.Options.Payload = draggedItem.DataContext; } if (e.Options.Status == DragStatus.DropSourceQuery) { e.QueryResult = true; e.Handled = true; } } private void OnDragInfo(object sender, DragDropEventArgs e) { // if we are dropping on the appropriate listbox, then remove the item from the first listbox. if (e.Options.Status == DragStatus.DragComplete) { var itemsControl = e.Options.Source.FindItemsConrolParent() as ItemsControl; var itemsSource = itemsControl.ItemsSource as IList; itemsSource.Remove(e.Options.Payload); } } private void OnDropQuery(object sender, DragDropQueryEventArgs e) { var destination = e.Options.Destination as ListBox; if (e.Options.Status == DragStatus.DropDestinationQuery && destination != null) { e.QueryResult = true; e.Handled = true; } } private void OnDropInfo(object sender, DragDropEventArgs e) { // if we are dropping on the appropriate listbox, then add the dragged item to it. var destination = e.Options.Destination as ItemsControl; if (e.Options.Status == DragStatus.DropComplete && destination != null) { (destination.ItemsSource as IList).Add(e.Options.Payload); } } } public class CheckableItemsViewModel { public bool IsChecked { get; set; } public string Name { get; set; } } public static class ControlExtensions { public static ItemsControl FindItemsConrolParent(this FrameworkElement target) { ItemsControl result = null; result = target.Parent as ItemsControl; if (result != null) { return result; } result = ItemsControl.ItemsControlFromItemContainer(target); if (result != null) { return result; } return FindVisualParent<ItemsControl>(target); } public static T FindVisualParent<T>(FrameworkElement target) where T : FrameworkElement { if (target == null) { return null; } var visParent = VisualTreeHelper.GetParent(target); var result = visParent as T; if (result != null) { return result; } return FindVisualParent<T>(visParent as FrameworkElement); } }}<Window x:Class="RadDragDrop2.MainWindow" xmlns:telerikDragDrop="clr-namespace:Telerik.Windows.Controls.DragDrop;assembly=Telerik.Windows.Controls" Title="MainWindow" Width="320" Height="240"> <Window.Resources> <DataTemplate x:Key="ItemTemplate"> <CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay}" Content="{Binding Name}" /> </DataTemplate> <Style TargetType="Control" x:Key="DraggableItem"> <Setter Property="telerikDragDrop:RadDragAndDropManager.AllowDrag" Value="True" /> <Setter Property="telerikDragDrop:RadDragAndDropManager.AllowDrop" Value="True" /> </Style> <Style TargetType="ListBox" x:Key="DraggableListBox"> <Setter Property="telerikDragDrop:RadDragAndDropManager.AllowDrop" Value="True" /> <Setter Property="ItemContainerStyle" Value="{StaticResource DraggableItem}" /> </Style> <DataTemplate x:Key="DragCueTemplate"> <TextBlock Text="{Binding Name}"/> </DataTemplate> </Window.Resources> <Grid x:Name="LayoutRoot"> <Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition /> </Grid.ColumnDefinitions> <ListBox x:Name="listBox1" Grid.Column="0" ItemsSource="{Binding Path=List1}" ItemTemplate="{StaticResource ItemTemplate}" Style="{StaticResource DraggableListBox}"/> <ListBox x:Name="listBox2" Grid.Column="1" ItemsSource="{Binding Path=List2}" ItemTemplate="{StaticResource ItemTemplate}" Style="{StaticResource DraggableListBox}"/> </Grid></Window><chart:RadChart Name="qwe" Content="RadChart" ItemsSource="{Binding PieChartItems}"> <chart:RadChart.DefaultView> <charting:ChartDefaultView> <charting:ChartDefaultView.ChartArea/> <charting:ChartDefaultView.ChartTitle> <charting:ChartTitle Content="CHART TITLE"/> </charting:ChartDefaultView.ChartTitle> <charting:ChartDefaultView.ChartLegend> <charting:ChartLegend x:Name="ChartLegend2" Visibility="Visible" Header="ABC" Padding="0,0,5,0" HorizontalContentAlignment="Right" BorderThickness="0" Background="Transparent"/> </charting:ChartDefaultView.ChartLegend> </charting:ChartDefaultView> </chart:RadChart.DefaultView>