Hello,
In a RadPaneGroup with a RadGridView we are showing some detials of a SQL search. In the background is a ViewModel and one of the property contains the resultrecords as array. Each new search request will create a new array of records and through a binding it changes the ItemsSource property of RadGridView.
new Version 2012.2.725.40: the focus will jump into the RadGridView when RadPaneGroup is floating
old Version 2012.1.215.40: its all ok, the Fosuce stay in e.g. TextBox
a SampleApp below
In a RadPaneGroup with a RadGridView we are showing some detials of a SQL search. In the background is a ViewModel and one of the property contains the resultrecords as array. Each new search request will create a new array of records and through a binding it changes the ItemsSource property of RadGridView.
new Version 2012.2.725.40: the focus will jump into the RadGridView when RadPaneGroup is floating
old Version 2012.1.215.40: its all ok, the Fosuce stay in e.g. TextBox
a SampleApp below
<
Window
x:Class
=
"RadGridViewFocusStealing.MainWindow"
xmlns:telerik
=
"http://schemas.telerik.com/2008/xaml/presentation"
xmlns:RadGridViewFocusStealing
=
"clr-namespace:RadGridViewFocusStealing"
Title
=
"MainWindow"
Height
=
"350"
Width
=
"525"
>
<
Grid
>
<
Grid.RowDefinitions
>
<
RowDefinition
Height
=
"50"
/>
<
RowDefinition
Height
=
"29"
/>
<
RowDefinition
Height
=
"259*"
/>
</
Grid.RowDefinitions
>
<
Grid.DataContext
>
<
RadGridViewFocusStealing:GridDataContextViewModel
/>
</
Grid.DataContext
>
<
TextBlock
Grid.Row
=
"0"
Text
=
"Make the RadPaneGroup as floating. Select a record inside of the grid, than add some new records while typing in the TextBox below. You will see the focus will lost. If the RadPaneGroup is docked its all fine."
TextWrapping
=
"Wrap"
/>
<
telerik:RadWatermarkTextBox
Grid.Row
=
"1"
Text
=
"{Binding Path=DoSomethingOnChange, UpdateSourceTrigger=Explicit}"
KeyUp
=
"TextBox_KeyUp"
Margin
=
"2"
>
<
telerik:RadWatermarkTextBox.WatermarkContent
>
<
TextBlock
Text
=
"Just type any text and press ↵ Enter to apply"
Foreground
=
"Gray"
/>
</
telerik:RadWatermarkTextBox.WatermarkContent
>
</
telerik:RadWatermarkTextBox
>
<
telerik:RadDocking
Grid.Row
=
"2"
>
<
telerik:RadDocking.Items
>
<
telerik:RadSplitContainer
x:Name
=
"radSplitContainer"
>
<
telerik:RadSplitContainer.Items
>
<
telerik:RadPaneGroup
>
<
telerik:RadPaneGroup.Items
>
<
telerik:RadPane
>
<
telerik:RadGridView
AutoGenerateColumns
=
"False"
ItemsSource
=
"{Binding Path=DataItems}"
ShowGroupPanel
=
"False"
>
<
telerik:RadGridView.Columns
>
<
telerik:GridViewDataColumn
DataMemberBinding
=
"{Binding Path=Property1}"
/>
</
telerik:RadGridView.Columns
>
</
telerik:RadGridView
>
</
telerik:RadPane
>
</
telerik:RadPaneGroup.Items
>
</
telerik:RadPaneGroup
>
</
telerik:RadSplitContainer.Items
>
</
telerik:RadSplitContainer
>
</
telerik:RadDocking.Items
>
</
telerik:RadDocking
>
</
Grid
>
</
Window
>
using
System.Collections.Generic;
using
System.ComponentModel;
using
System.Linq;
using
System.Windows;
using
System.Windows.Controls;
using
System.Windows.Input;
using
Telerik.Windows.Controls.Docking;
namespace
RadGridViewFocusStealing
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public
partial
class
MainWindow : Window
{
public
MainWindow()
{
InitializeComponent();
radSplitContainer.InitialPosition = DockState.FloatingDockable;
}
private
void
TextBox_KeyUp(
object
sender, System.Windows.Input.KeyEventArgs e)
{
if
(e.Key == Key.Enter && e.KeyboardDevice.Modifiers == ModifierKeys.None)
{
var b = ((TextBox)sender).GetBindingExpression(TextBox.TextProperty);
if
(b !=
null
)
b.UpdateSource();
}
}
}
public
class
GridDataContextViewModel : INotifyPropertyChanged
{
private
IEnumerable<GridDataItem> _dataItems;
public
GridDataContextViewModel()
{
_dataItems =
new
GridDataItem[] {
new
GridDataItem() { Property1 =
"Foo"
},
new
GridDataItem() { Property1 =
"Baa"
} };
}
private
string
_doSomethingOnChange;
public
string
DoSomethingOnChange
{
get
{
return
_doSomethingOnChange; }
set
{
_doSomethingOnChange = value;
OnNotifyPropertyChanged(
"DoSomethingOnChange"
);
// As simulation, creating a new data array (e.g. a result of a SQLQuery as array) for GridView.ItemsSource
DataItems = _dataItems.Union(
new
GridDataItem[] {
new
GridDataItem { Property1 = value } }).ToArray();
}
}
public
IEnumerable<GridDataItem> DataItems
{
get
{
return
_dataItems; }
private
set
{
if
(_dataItems != value)
{
_dataItems = value;
OnNotifyPropertyChanged(
"DataItems"
);
}
}
}
private
void
OnNotifyPropertyChanged(
string
propertyName)
{
if
(PropertyChanged !=
null
)
PropertyChanged(
this
,
new
PropertyChangedEventArgs(propertyName));
}
public
event
PropertyChangedEventHandler PropertyChanged;
}
public
class
GridDataItem
{
public
string
Property1 {
get
;
set
; }
}
}