在MVVM架构中设置控制焦点的好习惯是什么.
我设想它的方式是使用ViewModel上的属性,它会在需要时触发焦点更改.并且让UI控件绑定/侦听该属性,以便在它更改时,将设置适当的焦点.
我将其视为ViewModel,因为我希望在ViewModel执行某个操作后设置焦点,例如加载某些数据.
什么是最佳做法?
如何在TextBox
不指定名称的情况下将焦点设置为a TextBox
?目前我正在做以下事情
<Window FocusManager.FocusedElement="{Binding ElementName=Username}">
<Grid>
<TextBox Text="{Binding Username}" Name="Username" />
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
是否有任何方法可以在不指定名称的情况下执行此操作TextBox
.我相信MVVM中有一个Name元素通常意味着糟糕的设计?
我有一个WPF DataGrid,其中一些数据绑定到LINQ to SQL实体类.一列是显示给定航班的空中时间的时钟,它是使用Flight的部分类中的逻辑计算的.我有一个定时器,每隔2秒调用datagrid.Items.Refresh来更新时钟.
刷新工作正常,但现在我正在添加键盘快捷键.使用键盘箭头浏览单元格可以在关闭计时器的情况下正常工作,但启用刷新计时器后,聚焦单元格(实际上是整个数据网格)将失去焦点.
我需要以某种方式保持焦点(首选)或在DataGrid聚焦时禁用计时器.我甚至无法让后者工作.我试过了:
if (!dataGrid.IsFocused)
dataGrid.Items.Refresh();
Run Code Online (Sandbox Code Playgroud)
和
if (!dataGrid.IsKeyboardFocused)
dataGrid.Items.Refresh();
Run Code Online (Sandbox Code Playgroud)
对于计时器,但即使数据网格被聚焦,这些属性也会返回false.
有任何想法吗?
我在我的viewmodel中验证用户输入并在任何值验证失败的情况下抛出验证消息.
我只需要将焦点设置为验证失败的特定控件.
知道怎么做到这一点?
当我按下文本框中的箭头键时,我想将焦点设置为ui元素(ui元素是包含devexpress网格的弹出框).我希望它纯粹在XAML方面或使用MVVM.这会有用吗 让我知道我能做到这一点的方式.
<KeyBinding Key="Down" FocusManager.FocusedElement="{Binding ElementName=PART_GridControl}"/>
Run Code Online (Sandbox Code Playgroud)
我正在使用这样的代码,但我想实现mvvm.i希望将焦点从文本框更改为网格控件,当我按下文本框中的箭头键 -
private void text_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Down || e.Key == Key.Up || e.Key == Key.Left || e.Key == Key.Right)
{
PART_GridControl.Focus();
}
}
Run Code Online (Sandbox Code Playgroud) 我有多个文本框的网格.根据用户可能采取的操作,应将焦点更改为其中一个文本框.我当前的解决方案使用ViewModel中的字符串属性和xaml中的数据触发器来更改焦点.它工作得很好,但它似乎是一个相当迂回的方式来实现这一点,所以我想知道它是否可以以一种更清晰的方式完成?
<Grid.Style>
<Style TargetType="Grid">
<Style.Triggers>
<DataTrigger Binding="{Binding FocusedItem}" Value="number">
<Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=number}"/>
</DataTrigger>
<DataTrigger Binding="{Binding FocusedItem}" Value="name">
<Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=name}"/>
</DataTrigger>
<DataTrigger Binding="{Binding FocusedItem}" Value="id">
<Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=id}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,属性的值和元素的名称是相同的,所以我想在单个触发器上执行此操作,而不是每个元素都有一个触发器.
也许有人可以想出一个更清洁的方式?
提前致谢
在WPF程序中,我想获得当前(键盘)Focus,存储它并在以后重新设置它.
为了获得当前的焦点,我使用:
DependencyObject focusScope = FocusManager.GetFocusScope(d);
_lastFocus = FocusManager.GetFocusedElement(focusScope);
Run Code Online (Sandbox Code Playgroud)
要稍后设置我使用:
if (_lastFocus != null)
{
IInputElement setFocus = _lastFocus;
_lastFocus = null;
d.Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, new ThreadStart(delegate
{
FocusManager.SetFocusedElement(d, setFocus);
}));
}
Run Code Online (Sandbox Code Playgroud)
这个工作一次.但是,如果我再试一次,它会起作用,直到我重新创建我试图设置焦点的有问题的对话框,即使它做了同样的事情(我追踪并设置焦点).而是主窗口本身获得焦点.
我曾经听说过WPF中有两种焦点,我是否还需要设置其他内容以获得一致的结果?
我有一个文本框,我有这个:
<KeyBinding Command="{Binding MyCommand}" Key="Tab"/>
问题是它吞下Tab并且没有Tab到下一个控件.如何捕获文本框的Tab并仍然将Tab键保留到Tab键顺序中的下一个控件?编辑:我也在使用MVVM和MyCommand在ViewModel代码中,所以我需要重新抛出Tab.
我有一个TreeView
项目由HierarchicalDataTemplate
s 定义.每个TreeViewItem
创建的都有一些TextBox
es.当TreeViewItem
选择我想设置键盘Focus
到TextBox
的TreeViewItem
(在TextBox
其名称TextBox1
).我怎样才能做到这一点?
那么如何使用MVVM模式关注按钮上的TextBox?
我创建了一个简单的测试项目基于这个答案,它在第一次点击时起作用,但之后它不再设置焦点.我错过了什么?
XAML(查看)
<Grid>
<TextBox Height='23' HorizontalAlignment='Left' Margin='12,12,0,0' VerticalAlignment='Top' Width='120'
Text='{Binding TheText}'
local:FocusExtension.IsFocused="{Binding IsFocused}"/>
<Button Content='Click' Height='23' HorizontalAlignment='Left' Margin='138,11,0,0' VerticalAlignment='Top' Width='75'
Command='{Binding ClickCommand}'/>
<Button Content='Just to deFocus' Height='28' HorizontalAlignment='Left' Margin='14,44,0,0' Name='button1' VerticalAlignment='Top' Width='199' />
</Grid>
Run Code Online (Sandbox Code Playgroud)
视图模型
public class ViewModel : INotifyPropertyChanged
{
public string TheText { get; set; }
public bool IsFocused { get; set; }
private RelayCommand _clickCommand;
public ICommand ClickCommand
{
get { return _clickCommand ?? (_clickCommand = new RelayCommand(param => this.OnClick())); }
}
private void …
Run Code Online (Sandbox Code Playgroud) 我的ItemsControl它的ItemsSource
属性从后面的代码绑定到一些字典.该ItemTemplate
IS仅由一个按钮.因此,对于字典中的每个项目,它都会创建按钮.
我的问题是如何将焦点设置为其中一个按钮(动态)?我应该用ItemContainerGenerator.ContainerFromItem
吗?还有其他想法吗?
提前致谢!
wpf ×11
mvvm ×7
c# ×5
focus ×4
xaml ×2
.net ×1
data-binding ×1
datagrid ×1
focusmanager ×1
key-bindings ×1
refresh ×1
setfocus ×1
textbox ×1
timer ×1
treeview ×1
treeviewitem ×1