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
>