如何使用MVVM将焦点设置到文本框?

Niv*_*kia 15 c# wpf xaml mvvm

如何从ViewModel wpf中聚焦文本框?

<TextBox Name="PropertySearch"
         Text="{Binding UpdateSourceTrigger=PropertyChanged, 
                        Mode=TwoWay, Path=PropertySearch, 
                        ValidatesOnDataErrors=True}"  
         Width="110" 
         Height="25" 
         Margin="10" />
Run Code Online (Sandbox Code Playgroud)

Har*_*ess 46

您可以通过向ViewModel添加属性(或使用现有属性)来执行此操作,该属性指示何时应发生SetFocus,但View应负责实际设置焦点,因为这纯粹与View相关.

您可以使用DataTrigger执行此操作.

视图:

<Grid Name="LayoutRoot" DataContext="{StaticResource MyViewModelInstance}">
    <Grid.Style>
        <Style>
            <Style.Triggers>
                <DataTrigger Binding="{Binding UserShouldEditValueNow}" Value="True">
                    <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=PropertySearch}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Grid.Style>
    <TextBox   Name="PropertySearch"   Text="{Binding UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, Path=PropertySearch, ValidatesOnDataErrors=True}" Width="110" Height="25" Margin="10" />
</Grid>
Run Code Online (Sandbox Code Playgroud)

视图模型:

// When you think the view should set focus on a control
this.UserShouldEditValueNow = true;
Run Code Online (Sandbox Code Playgroud)

通过使用布尔ViewModel属性"UserShouldEditValueNow"简化了上面的示例.您可以将这样的属性添加到ViewModel或使用指示此状态的其他一些exising属性.

注意:那么为什么在MVVM中这样做呢?一个原因是,假设View作者决定用ComboBox替换TextBox,或者甚至更好,假设你的属性是一个整数值,既有一个TextBox来查看/编辑这个数字,另一个是Slider作为另一种编辑相同值的方法,两个控件都绑定到同一个属性...... ViewModel将如何知道要设置焦点的控件?(当它甚至不知道哪个控件或控件首先绑定到它时)这样,View可以通过更改DataTrigger Setter中的ElementName绑定目标来选择要关注的控件.

快乐的编码!

  • 我发现将样式直接放在控件中进行聚焦并将setter与`{RelativeSource Mode = Self}`绑定以避免ElementName更好. (12认同)

Ben*_*aub 10

你应该问自己的问题是"为什么我的ViewModel需要知道哪个控件有焦点?"

我认为焦点是一个只有视图的属性; 它是一种交互属性,与概念状态无关.这类似于控件的背景颜色:为什么要在VM中表示它?如果需要以自定义方式管理焦点,最好使用视图级对象来完成工作.

  • 这不是一个有用的答案。业务逻辑如何准确地与您提议的视图对象通信?关键是系统中发生了某些事情,导致需要将焦点设置到某些控件中。OP 使用 MVVM 模式。因此,在 MVVM 模式中,以允许各个部分进行通信的方式获取焦点的最佳方法是什么。您的回答没有提供任何指导。 (5认同)