如何从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绑定目标来选择要关注的控件.
快乐的编码!
Ben*_*aub 10
你应该问自己的问题是"为什么我的ViewModel需要知道哪个控件有焦点?"
我认为焦点是一个只有视图的属性; 它是一种交互属性,与概念状态无关.这类似于控件的背景颜色:为什么要在VM中表示它?如果需要以自定义方式管理焦点,最好使用视图级对象来完成工作.
归档时间: |
|
查看次数: |
30066 次 |
最近记录: |