Sha*_*owe 48 c# wpf textbox focus mvvm
我有一个View,它下面有一个TextBox
和几个Button
.当窗口加载时我希望它TextBox
具有焦点.
如果我没有使用MVVM,我只会调用TextBox.Focus()
Loaded事件.但是我的ViewModel不了解我的视图,那么如何在不将代码放入视图的代码隐藏的情况下完成此操作呢?
编辑:在阅读答案后,我决定将此代码放在xaml视图中
<DockPanel FocusManager.FocusedElement="{Binding ElementName=MessageTextBox}">
<TextBox Name="MessageTextBox" Text="{Binding Message}"/>
</DockPanel>
Run Code Online (Sandbox Code Playgroud)
如果这不是初始页面焦点,我可能会推荐Jon Galloway的答案,因为它可以从ViewModel控制.
And*_*mes 50
如果它让你感觉更好(它让我感觉更好)你可以使用附加属性在Xaml中执行此操作:
http://msdn.microsoft.com/en-us/library/system.windows.input.focusmanager.focusedelement.aspx
如果你知道技巧,你可以在Xaml中做任何你可以在代码隐藏中做的事情.幸运的是,你没有必要实现这个技巧 - MS为你做了.
Mar*_*ris 14
在这种情况下,我认为将代码放入视图中是可以的.将焦点设置为控件会影响用户界面的行为而不是应用程序的逻辑,因此是视图的责任.
使用FocusManager绑定到该属性.
<Window FocusManager.FocusedElement="{Binding ElementName=ViewModel.FocusedItem}"/>
Run Code Online (Sandbox Code Playgroud)您的ViewModel是一个翻译器,仅用于向View提供信息,因此您可以向View中需要运行的VM添加任何信息.
实际上,是不是关注UI关注?MVVM是关于分离关注点 - 属于模型的东西在模型中,属于视图的是什么,以及将模型和视图绑定在一起的是ViewModel(这当然是过于简化的描述).
这意味着,UI逻辑保留在View中 - TextBox.Focus()在我看来是实现这一目标的恰当方式.
我认为具有焦点的控件非常“仅可视”,因此在代码后面不会有任何问题。
VM 的想法是将逻辑从视图中移开,并为要绑定到的视图提供模型的数据绑定友好版本。这并不一定意味着所有代码都应该存在于 VM 中,只是逻辑代码和任何不直接绑定到 UI 的代码。
归档时间: |
|
查看次数: |
29965 次 |
最近记录: |