相关疑难解决方法(0)

WPF-MVVM:从ViewModel设置UI控件焦点

在MVVM架构中设置控制焦点的好习惯是什么.

我设想它的方式是使用ViewModel上的属性,它会在需要时触发焦点更改.并且让UI控件绑定/侦听该属性,以便在它更改时,将设置适当的焦点.

我将其视为ViewModel,因为我希望在ViewModel执行某个操作后设置焦点,例如加载某些数据.

什么是最佳做法?

.net c# wpf focus mvvm

46
推荐指数
2
解决办法
6万
查看次数

MVVM Focus To Textbox

如何在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 textbox mvvm

10
推荐指数
3
解决办法
2万
查看次数

刷新WPF DataGrid而不会丢失单元格焦点

我有一个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.

有任何想法吗?

wpf datagrid focus refresh timer

8
推荐指数
1
解决办法
8598
查看次数

如何使用MVVM将焦点设置为WPF控件?

我在我的viewmodel中验证用户输入并在任何值验证失败的情况下抛出验证消息.

我只需要将焦点设置为验证失败的特定控件.

知道怎么做到这一点?

c# wpf mvvm setfocus

8
推荐指数
1
解决办法
1万
查看次数

使用XAML或MVVM将焦点设置为UI元素

当我按下文本框中的箭头键时,我想将焦点设置为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)

wpf xaml mvvm

6
推荐指数
0
解决办法
2万
查看次数

使用MVVM在WPF中设置焦点

我有多个文本框的网格.根据用户可能采取的操作,应将焦点更改为其中一个文本框.我当前的解决方案使用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)

正如您所看到的,属性的值和元素的名称是相同的,所以我想在单个触发器上执行此操作,而不是每个元素都有一个触发器.

也许有人可以想出一个更清洁的方式?

提前致谢

c# data-binding wpf mvvm focusmanager

6
推荐指数
1
解决办法
6791
查看次数

获取和恢复WPF键盘焦点

在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中有两种焦点,我是否还需要设置其他内容以获得一致的结果?

wpf focus

6
推荐指数
1
解决办法
2万
查看次数

WPF:Tab,Swallows选项卡的KeyBinding并且不传递它

我有一个文本框,我有这个: <KeyBinding Command="{Binding MyCommand}" Key="Tab"/>

问题是它吞下Tab并且没有Tab到下一个控件.如何捕获文本框的Tab并仍然将Tab键保留到Tab键顺序中的下一个控件?编辑:我也在使用MVVM和MyCommand在ViewModel代码中,所以我需要重新抛出Tab.

c# wpf key-bindings mvvm

5
推荐指数
1
解决办法
2659
查看次数

选中时如何将焦点设置到TreeViewItem中的控件

我有一个TreeView项目由HierarchicalDataTemplates 定义.每个TreeViewItem创建的都有一些TextBoxes.当TreeViewItem选择我想设置键盘FocusTextBoxTreeViewItem(在TextBox其名称TextBox1).我怎样才能做到这一点?

wpf treeview focus treeviewitem

2
推荐指数
1
解决办法
3575
查看次数

如何在按钮单击上聚焦TextBox

那么如何使用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)

c# wpf xaml mvvm

2
推荐指数
1
解决办法
4198
查看次数

如何在ItemsControl上设置焦点元素?

我的ItemsControl它的ItemsSource属性从后面的代码绑定到一些字典.该ItemTemplateIS仅由一个按钮.因此,对于字典中的每个项目,它都会创建按钮.

我的问题是如何将焦点设置为其中一个按钮(动态)?我应该用ItemContainerGenerator.ContainerFromItem吗?还有其他想法吗?

提前致谢!

wpf

1
推荐指数
1
解决办法
4146
查看次数