如何使用MVVM将焦点设置到文本框?如何从ViewModelwpf聚焦文本框?您可以通过向ViewModel添加一个属性(或使用现有属性)来指示SetFocus应该何时发生,但是View应该负责实际设置焦点,因为这完全与View相关。您可以使用DataTrigger来执行此操作。View:ViewModel://当您认为视图应该将焦点设置在控件上时this.UserShouldEditValueNow=true;通过使用BooleanViewModel属性“UserShouldEditValueNow”简化了上面的示例。您可以将此类属性添加到ViewModel或使用其他一些指示此状态的现有属性。注意:那么为什么要在MVVM中执行此操作?一个原因是,假设View作者决定用ComboBox替换TextBox,或者甚至更好,假设您的属性是一个整数值,并且您既有一个TextBox来查看/编辑数字,又有一个Slider作为另一个来编辑同值法,两个控件都绑定到相同的属性......ViewModel如何知道要将焦点设置在哪个控件上?(当它甚至不知道哪个或哪些控件首先绑定到它时)这样,View可以通过更改DataTriggerSetter中的ElementName绑定目标来选择要关注的控件。编码愉快!您应该问自己的问题是“为什么我的ViewModel需要知道哪个控件具有焦点?”我认为focus是一个只能查看的属性;它是一种交互属性,与概念状态无关。这类似于控件的背景颜色:为什么它会在VM中表示?如果您需要以自定义方式管理焦点,最好使用视图级对象来完成工作。在父控件中,添加以下属性:FocusManager.FocusedElement="{BindingElementName=PropertySearch}"有时可以从VM执行此操作,尽管纯粹主义者可能会主张将其从VM中删除。我的方法是让视图实现一个接口,将该接口传递给ViewModel,然后让VM调用接口上的方法。示例:公共接口IFocusContainer{voidSetFocus(stringtarget);需要记住的几件事:一个VM可能提供多个视图实例,因此您的VM可能希望拥有一组对IFocusContainer实例的引用,而不仅仅是一个。防御性地编码虚拟机。您不知道是否有0、1或20个视图在收听。SetFocus()的“目标”参数应该“松散地”耦合到VM。您不希望VM关心UI中的确切控件名称。相反,VM应该指示仅为焦点管理定义的名称。在我的例子中,我创建了一些附加属性,允许我用“焦点名称”来“标记”控件。要实现该接口,您可以:在代码隐藏中实现它创建一些知道如何附加到DataContext中存在的ViewModel的行为。在CodeBehind上实现它没有错,但行为方法只允许XAML连接,如果这对你很重要的话。在您的界面实现中,您可以使用可视化树来定位控件,或者您可以为一组已知的可聚焦项目编写switch语句。以上就是C#学习教程:如何使用MVVM将焦点设置到文本框?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
