Hi,
I am using Caliburn Micro to implement my MVVM pattern. I bind a BindableCollection of Order objects as the ItemsSource for the GridView.
I'm doing a custom sort of the collection in the ViewModel, based on a selected predefined sort order (also stored in the ViewModel as a BindableCollection of objects).
What I'd like to do is add an arrow image to any columns that are in the selected predefined sort.
Here's part of my ViewModel:
The OrderSortDefinition has multiple properties that I plan on binding to the column headers to display the sort image. Here's a sample:
And finally, here's where I set up the GridView in the XAML file:
For each column header, I have a text block that will not change, and an image that will either be ascending, descending, or not there based on the bool? that is a property on the SelectedOrderSortDefinition object in the ViewModel.
I have this set up like this, and the breakpoint that I set in my converter never even fires. Any help/suggestions?
Thanks,
-Dan Pingel
I am using Caliburn Micro to implement my MVVM pattern. I bind a BindableCollection of Order objects as the ItemsSource for the GridView.
I'm doing a custom sort of the collection in the ViewModel, based on a selected predefined sort order (also stored in the ViewModel as a BindableCollection of objects).
What I'd like to do is add an arrow image to any columns that are in the selected predefined sort.
Here's part of my ViewModel:
private
BindableCollection<Order> _availableOrders;
public
BindableCollection<Order> AvailableOrders {
get
{
return
_availableOrders; }
set
{
_availableOrders = value;
NotifyOfPropertyChange(() => AvailableOrders);
}
}
private
BindableCollection<OrderSortDefinition> _orderSortDefinitions;
public
BindableCollection<OrderSortDefinition> OrderSortDefinitions {
get
{
return
_orderSortDefinitions; }
set
{
_orderSortDefinitions = value;
NotifyOfPropertyChange(() => OrderSortDefinitions);
}
}
private
OrderSortDefinition _selectedOrderSortDefinition;
public
OrderSortDefinition SelectedOrderSortDefinition {
get
{
return
_selectedOrderSortDefinition; }
set
{
if
(value != _selectedOrderSortDefinition) {
_selectedOrderSortDefinition = value;
NotifyOfPropertyChange(() => SelectedOrderSortDefinition);
}
}
}
The OrderSortDefinition has multiple properties that I plan on binding to the column headers to display the sort image. Here's a sample:
public
class
OrderSortDefinition {
public
OrderSortDefinition() {
this
.Name =
string
.Empty;
this
.Details =
new
List<OrderSortInfo>();
}
public
string
Name {
get
;
set
; }
public
IList<OrderSortInfo> Details {
get
;
set
; }
public
bool
HasDetails {
get
{
return
null
!= Details && Details.Count > 0; }
}
public
Tuple<
string
, DynamicSortDirection>[] GetSortCriterion() {
List<Tuple<
string
, DynamicSortDirection>> criterion =
new
List<Tuple<
string
, DynamicSortDirection>>();
foreach
(OrderSortInfo sortInfo
in
Details)
criterion.Add(sortInfo.GetDynamicSortCriteria());
return
criterion.ToArray();
}
public
bool
? IsToolingAscending {
get
{
return
GetSortDirectionByProperty(OrderProperty.ToolingCode); }
}
public
bool
? IsMaterialAscending {
get
{
return
GetSortDirectionByProperty(OrderProperty.MaterialCode); }
}
public
bool
? IsOrderAscending {
get
{
return
GetSortDirectionByProperty(OrderProperty.OrderCode); }
}
public
bool
? IsFootageAscending {
get
{
return
GetSortDirectionByProperty(OrderProperty.Footage); }
}
public
bool
? IsCustomerAscending {
get
{
return
GetSortDirectionByProperty(OrderProperty.CustomerName); }
}
public
bool
? IsDateAscending {
get
{
return
GetSortDirectionByProperty(OrderProperty.RequestedDate); }
}
public
bool
? IsTruckAscending {
get
{
return
GetSortDirectionByProperty(OrderProperty.TruckNumber); }
}
private
bool
? GetSortDirectionByProperty(OrderProperty property) {
var sortInfo = Details.Where(p => p.Association == property).First();
if
(
null
!= sortInfo)
return
sortInfo.SortDirection == DynamicSortDirection.Ascending;
else
return
null
;
}
}
And finally, here's where I set up the GridView in the XAML file:
<
telerik:RadGridView
x:Name
=
"AvailableOrders"
ItemsSource
=
"{Binding AvailableOrders}"
AutoGenerateColumns
=
"False"
ShowGroupPanel
=
"False"
IsReadOnly
=
"True"
CanUserSortColumns
=
"False"
IsFilteringAllowed
=
"False"
SelectionMode
=
"Extended"
>
<
telerik:RadGridView.Columns
>
<
telerik:GridViewDataColumn
DataMemberBinding
=
"{Binding PCode}"
>
<
telerik:GridViewColumn.Header
>
<
StackPanel
Orientation
=
"Horizontal"
HorizontalAlignment
=
"Center"
VerticalAlignment
=
"Center"
>
<
TextBlock
Text
=
"Tooling"
VerticalAlignment
=
"Center"
HorizontalAlignment
=
"Center"
/>
<
Image
Source
=
"{Binding SelectedOrderSortDefinition.IsToolingAscending, Converter={StaticResource NullBoolToImageConverter}}"
VerticalAlignment
=
"Center"
HorizontalAlignment
=
"Center"
Margin
=
"3"
MaxWidth
=
"20"
MinWidth
=
"20"
/>
</
StackPanel
>
</
telerik:GridViewColumn.Header
>
</
telerik:GridViewDataColumn
>
<
telerik:GridViewDataColumn
DataMemberBinding
=
"{Binding MaterialCode}"
>
<
telerik:GridViewColumn.Header
>
<
StackPanel
Orientation
=
"Horizontal"
HorizontalAlignment
=
"Center"
VerticalAlignment
=
"Center"
>
<
TextBlock
Text
=
"Material"
VerticalAlignment
=
"Center"
HorizontalAlignment
=
"Center"
/>
<
Image
Source
=
"{Binding SelectedOrderSortDefinition.IsMaterialAscending, Converter={StaticResource NullBoolToImageConverter}}"
VerticalAlignment
=
"Center"
HorizontalAlignment
=
"Center"
Margin
=
"3"
MaxWidth
=
"15"
MinWidth
=
"15"
/>
</
StackPanel
>
</
telerik:GridViewColumn.Header
>
</
telerik:GridViewDataColumn
>
<
telerik:GridViewDataColumn
DataMemberBinding
=
"{Binding OrderCode}"
>
<
telerik:GridViewColumn.Header
>
<
StackPanel
Orientation
=
"Horizontal"
HorizontalAlignment
=
"Center"
VerticalAlignment
=
"Center"
>
<
TextBlock
Text
=
"Order"
VerticalAlignment
=
"Center"
HorizontalAlignment
=
"Center"
/>
<
Image
Source
=
"{Binding SelectedOrderSortDefinition.IsOrderAscending, Converter={StaticResource NullBoolToImageConverter}}"
VerticalAlignment
=
"Center"
HorizontalAlignment
=
"Center"
Margin
=
"3"
MaxWidth
=
"15"
MinWidth
=
"15"
/>
</
StackPanel
>
</
telerik:GridViewColumn.Header
>
</
telerik:GridViewDataColumn
>
<
telerik:GridViewDataColumn
DataMemberBinding
=
"{Binding Footage}"
>
<
telerik:GridViewColumn.Header
>
<
StackPanel
Orientation
=
"Horizontal"
HorizontalAlignment
=
"Center"
VerticalAlignment
=
"Center"
>
<
TextBlock
Text
=
"Footage"
VerticalAlignment
=
"Center"
HorizontalAlignment
=
"Center"
/>
<
Image
Source
=
"{Binding SelectedOrderSortDefinition.IsFootageAscending, Converter={StaticResource NullBoolToImageConverter}}"
VerticalAlignment
=
"Center"
HorizontalAlignment
=
"Center"
Margin
=
"3"
MaxWidth
=
"15"
MinWidth
=
"15"
/>
</
StackPanel
>
</
telerik:GridViewColumn.Header
>
</
telerik:GridViewDataColumn
>
<
telerik:GridViewDataColumn
DataMemberBinding
=
"{Binding CustomerName}"
>
<
telerik:GridViewColumn.Header
>
<
StackPanel
Orientation
=
"Horizontal"
HorizontalAlignment
=
"Center"
VerticalAlignment
=
"Center"
>
<
TextBlock
Text
=
"Customer"
VerticalAlignment
=
"Center"
HorizontalAlignment
=
"Center"
/>
<
Image
Source
=
"{Binding SelectedOrderSortDefinition.IsCustomerAscending, Converter={StaticResource NullBoolToImageConverter}}"
VerticalAlignment
=
"Center"
HorizontalAlignment
=
"Center"
Margin
=
"3"
MaxWidth
=
"15"
MinWidth
=
"15"
/>
</
StackPanel
>
</
telerik:GridViewColumn.Header
>
</
telerik:GridViewDataColumn
>
<
telerik:GridViewDataColumn
DataMemberBinding
=
"{Binding TruckNumber}"
>
<
telerik:GridViewColumn.Header
>
<
StackPanel
Orientation
=
"Horizontal"
HorizontalAlignment
=
"Center"
VerticalAlignment
=
"Center"
>
<
TextBlock
Text
=
"Route"
VerticalAlignment
=
"Center"
HorizontalAlignment
=
"Center"
/>
<
Image
Source
=
"{Binding SelectedOrderSortDefinition.IsTruckAscending, Converter={StaticResource NullBoolToImageConverter}}"
VerticalAlignment
=
"Center"
HorizontalAlignment
=
"Center"
Margin
=
"3"
MaxWidth
=
"15"
MinWidth
=
"15"
/>
</
StackPanel
>
</
telerik:GridViewColumn.Header
>
</
telerik:GridViewDataColumn
>
<
telerik:GridViewDataColumn
DataMemberBinding
=
"{Binding RequestedDate, Converter={StaticResource PrettyDateConverter}}"
>
<
telerik:GridViewColumn.Header
>
<
StackPanel
Orientation
=
"Horizontal"
HorizontalAlignment
=
"Center"
VerticalAlignment
=
"Center"
>
<
TextBlock
Text
=
"Requested"
VerticalAlignment
=
"Center"
HorizontalAlignment
=
"Center"
/>
<
Image
Source
=
"{Binding SelectedOrderSortDefinition.IsDateAscending, Converter={StaticResource NullBoolToImageConverter}}"
VerticalAlignment
=
"Center"
HorizontalAlignment
=
"Center"
Margin
=
"3"
MaxWidth
=
"15"
MinWidth
=
"15"
/>
</
StackPanel
>
</
telerik:GridViewColumn.Header
>
</
telerik:GridViewDataColumn
>
</
telerik:RadGridView.Columns
>
For each column header, I have a text block that will not change, and an image that will either be ascending, descending, or not there based on the bool? that is a property on the SelectedOrderSortDefinition object in the ViewModel.
I have this set up like this, and the breakpoint that I set in my converter never even fires. Any help/suggestions?
Thanks,
-Dan Pingel