Hi!
When using the filter control I would like the apply filter button to close the filter control.
I found a behavior that takes care of this looking like this:
The problem is that when I use it, the funnel is displayed before any data is loaded into the grid.
As default, the funnel is only visible when the grid contains data.
If I click on the funnel when the grid is empty I get the following exception:
How can I work around this?
Is there any better way than using a behavior for it?
Regads,
Håkan
When using the filter control I would like the apply filter button to close the filter control.
I found a behavior that takes care of this looking like this:
using
System.Linq;
using
System.Windows;
using
System.Windows.Controls;
using
System.Windows.Interactivity;
using
Telerik.Windows.Controls;
using
Telerik.Windows.Controls.GridView;
namespace
Soe.Silverlight.Behaviors
{
/// <summary>
/// A behavior that closes the filtering popup of a column when the Apply Filter button is clicked.
/// </summary>
public
class
ClosePopupOnApplyFilterBehavior : Behavior<GridViewBoundColumnBase>
{
FilteringControl customFilteringControl;
Button applyFilterButton;
/// <summary>
/// Called after the behavior is attached to an AssociatedObject.
/// </summary>
/// <remarks>Override this to hook up functionality to the AssociatedObject.</remarks>
protected
override
void
OnAttached()
{
// This is the control that RadGridView uses internally if you don't specify a custom filtering control through the GridViewBoundColumnBase.FilteringControl property.
// We will create an instance of this default filtering control and use it as a "custom" filtering control in order to extend just a little bit with our custom logic.
// Everything else will be the same.
this
.customFilteringControl =
new
FilteringControl();
this
.customFilteringControl.Loaded +=
this
.OnFilteringControlLoaded;
// Tell the column to use our new "custom" filtering control.
// It will never now that this is the default one but spicied up a little.
this
.AssociatedObject.FilteringControl = customFilteringControl;
}
private
void
OnFilteringControlLoaded(
object
sender, RoutedEventArgs e)
{
// When it loads and all of its children are alive find the "Filter" button which is the only button on the control.
// You can find out what its name is from the FilteringControl template.
this
.applyFilterButton =
this
.customFilteringControl.ChildrenOfType<Button>().Where(b => b.Name ==
"PART_ApplyFilterButton"
).FirstOrDefault();
if
(
this
.applyFilterButton !=
null
)
this
.applyFilterButton.Click +=
this
.OnApplyFilter;
}
private
void
OnApplyFilter(
object
sender, RoutedEventArgs e)
{
// And when clicked find the parent popup and close it.
var popup = applyFilterButton.ParentOfType<System.Windows.Controls.Primitives.Popup>();
if
(popup !=
null
)
popup.IsOpen =
false
;
}
/// <summary>
/// Called when the behavior is being detached from its AssociatedObject,
/// but before it has actually occurred.
/// </summary>
/// <remarks>Override this to unhook functionality from the AssociatedObject.</remarks>
protected
override
void
OnDetaching()
{
if
(
this
.applyFilterButton !=
null
)
this
.applyFilterButton.Click -=
this
.OnApplyFilter;
this
.customFilteringControl.Loaded -=
this
.OnFilteringControlLoaded;
}
}
}
The problem is that when I use it, the funnel is displayed before any data is loaded into the grid.
As default, the funnel is only visible when the grid contains data.
If I click on the funnel when the grid is empty I get the following exception:
This columns cannot be filtered.
at Telerik.Windows.Controls.GridViewColumn.get_AvailableFilterOperators()
at Telerik.Windows.Controls.GridViewColumn.Telerik.Windows.Controls.IFilterableColumn.get_AvailableFilterOperators()
at Telerik.Windows.Controls.GridViewColumn.Telerik.Windows.Controls.IFilterableColumn.CallFilterOperatorsLoading()
at Telerik.Windows.Controls.GridView.FilteringViewModel.RefreshFieldFilters()
at Telerik.Windows.Controls.GridView.FilteringViewModel.Refresh()
at Telerik.Windows.Controls.GridView.FilteringControl.Prepare(GridViewColumn column)
at Telerik.Windows.Controls.GridView.FilteringDropDown.PrepareFilteringControl()
at Telerik.Windows.Controls.GridView.FilteringDropDown.OnDropDownPopupOpened(Object sender, EventArgs e)
at Telerik.Windows.Controls.AutoClosePopupWrapper.OnPopupOpened(Object sender, EventArgs e)
at MS.Internal.CoreInvokeHandler.InvokeEventHandler(UInt32 typeIndex, Delegate handlerDelegate, Object sender, Object args)
at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventName, UInt32 flags)
How can I work around this?
Is there any better way than using a behavior for it?
Regads,
Håkan