我希望关注特定的Textbox
并仅在用户按下数字键(1,2,3等)时接受按键,否则我不想关注Textbox
...
塞纳里奥:
我在视图中有ListView
(有自定义视图)。在列表视图下方,我有一个Textbox
。
让我们说ListView
包含编号为1,2,3,33,373等的项目。
现在,当我按一个数字键时,让我们说Key 3
,应该会发生以下操作:
TextBox
TextBox
文字
ListView
中与TextBox.Text
具有相同编号我尝试的Xaml
<ListView Name="lv"
Grid.Row="1"
ItemsSource="{Binding}"
View="{Binding Path=SelectedItem,
ElementName=viewComboBox}" DisplayMemberPath="Name" IsTextSearchEnabled="True" TextSearch.TextPath="{Binding Path=Person.Name}"/>
<TextBox Grid.Row="2" Text="{Binding Path=TextSearch.Text,ElementName=lv}"></TextBox>
TextBox
中没有显示任何内容,我不知道如何处理数字键按下。
我需要这个并且使用MVVM令人困惑......
在这方面的任何帮助都会很棒。使用代码的一些指导会更好......谢谢......
答案 0 :(得分:4)
此逻辑特定于视图。如果你把它放在代码后面就好了。 MVVM不会阻止您在代码中编写特定于视图的代码。
但是,如果您虔诚地遵循“无代码隐藏”方法,那么您可以创建Behavior并将所有代码放入其中。您的行为将附加到列表框,并将文本框引用作为属性。它将侦听列表框上的keydown事件,并将键添加到文本框的文本属性中。
你不应该在ViewModel
中拥有这样的逻辑答案 1 :(得分:0)
如果您使用的是MVVM,则可以采用附加行为 ...... http://eladm.wordpress.com/2009/04/02/attached-behavior/
将您的按键命名为ListView
...
<ListView x:Name="MyListView">
....
</ListView>
声明并定义ListView
类型的附加属性,说NumericKeyPressBehavior.FocusTarget
此FocusTarget
的来源将是MyListView
,行为将附加到您的TextBox
<TextBox local:NumericKeyPressBehavior.FocusTarget="{Binding ElementName=MyListView}"
.... />
在NumericKeyPressBehavior.FocusTarget
的依赖属性更改事件处理程序中,按下ListView上的按键,然后根据是否按下数字键,聚焦目标TextBox并将按下的键字符附加到它
private static void OnFocusTargetChanged(
DependencyObject o,
DependencyPropertyChangedEventArgs e)
{
var textBox = o as TextBox;
var listView = e.NewValue as ListView;
if (textBox != null && listView != null)
{
listView.KeyUp +=
(o1, e1) =>
{
var keyChar = GetKeyCharFromKeyCode(e1.Key);
if ("0123456789".Contains(keyChar.ToString()))
{
textBox.Focus();
textBox.Text += keyChar.ToString();
}
}
}
}
GetKeyCharFromKeyCode
.... C# How to translate virtual keycode to char?
这有帮助吗?