我有一个View,它在视图中包含两个视图(这些视图包含在ContainerControl中)。 在View的另一侧有一个 Telerik GridView ,用户可以在其中选择一行。选择行时,View的另一侧将动态更改为另一个View(和ViewModel)。动态视图是一个带有大量TextBox的简单Grid,所以没什么特别的。
现在,当用户想要为动态加载的视图输入值时,他必须先点击ContentControl
,然后再次点击他想要关注的TextBox
。仅当GridView的行处于编辑模式时才会发生这种情况。
我已尝试设置ContentControl的FocusManager.IsFocusScope="False"
。
我还尝试使用IsFocusable=False
设置所有其他控件。
我知道必须有一种方法可以用WPF事件做到这一点,但我不是这方面的专家。
我使用Catel的转换器设置动态视图(不知道它是否相关):
XAML:
<ContentControl Content="{Binding SelectedItemViewModel, Mode=TwoWay, Converter={catel:ViewModelToViewConverter}}" />
视图模型:
public MyDataModel SelectedItem
{
get { return GetValue<MyDataModel>(SelectedItemProperty); }
set
{
SetValue(SelectedItemProperty, value);
RaisePropertyChanged(() => SelectedItemViewModel);
}
}
public static readonly PropertyData SelectedItemProperty = RegisterProperty("SelectedItem", typeof(MyDataModel));
public ViewModelBase SelectedItemViewModel
{
get
{
if (SelectedItem != null)
{
switch (SelectedItem.Type)
{
case 1:
return new OneViewModel(SelectedItem);
case 2:
return new TwoViewModel(SelectedItem);
}
}
return null;
}
}
答案 0 :(得分:0)
这有点奇怪的行为。焦点应设置为鼠标单击控件而不是内容控件。我不确定你做错了什么。我尝试使用示例应用程序,它按预期工作。
This thread说没有好的解决方案。唯一的选择是在控件的模板中将内容控件的IsTabStop
属性设置为False
,然后添加子部件将绑定到的新属性IsChildTabStop
。我不确定它是否会对你有所帮助。
参考: MSDN Forum
答案 1 :(得分:0)
好吧,这是一个简单的解决方案 - 不是一个漂亮的解决方案:
这只是正确的答案 - 如果您只是希望在加载视图后让TextBox
拥有Focus
。
<强> XAML 强>
<UserControl x:Class="WpfApplication4.MyUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WpfApplication4"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<TextBox Loaded="TextBox_Loaded"/>
</Grid>
</UserControl>
<强>代码隐藏强>
private void TextBox_Loaded(object sender, RoutedEventArgs e)
{
TextBox self = sender as TextBox;
if (self != null)
self.Focus();
}
正如我所说 - 这是一个解决方法
答案 2 :(得分:0)
我通过删除外部视图(不同的xaml文件)引用并将视图合并到一个大的xaml来解决这个问题。由于某种原因,Telerik的网格视图&#34;偷走&#34;来自引用视图的光标,但是当所有控件都在同一个xaml文件上时,一切都按预期工作。