从视图传递状态信息到视图模型

3

如何最好地将当前视图模型状态传递回视图模型,特别是文本框的焦点状态?

我的要求是根据上下文进行搜索,具体取决于哪个文本框获得焦点,以确定在数据库中搜索哪个字段。

我正在使用MVVM模式,不想在视图中放置任何代码。

4个回答

2

TextBox创建一个附加属性,该属性是IsFocussed属性。然后使用双向绑定到您的ViewModel


这个能不能扩展,以便不再依赖于IsFocused和属性设置器,而是通过一个枚举指定要执行的搜索类型来返回附加属性的类型? - Rob
是的,在第二个附加属性上设置枚举,然后使用该附加属性的值来评估第一个附加属性。 - Dean Chalk

1
您可以使用Expression Blend SDK中提供的InvokeCommandAction
    <StackPanel>
    <TextBox>
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="GotFocus">
                <i:InvokeCommandAction Command="{Binding YourCommand}"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </TextBox>
    </StackPanel>

在哪里:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

应该补充说明,您需要将System.Windows.Interactivity.dll添加为引用,该文件可以在Silverlight 4 SDK中找到。 - Rob

1
你不想把与视图相关的东西放在你的VM中。焦点明显是与视图相关的内容。在VM中,您应该通过一些可绑定属性来跟踪当前选定的搜索字段。在视图中改变焦点应该以某种方式更新当前属性。我认为在视图的代码后台没有问题,这是跟踪焦点并更新VM的最简单的方法。如果您不想进行代码后台,则还可以通过值转换器或附加行为完成此操作。

0

我真的没有看到任何在不稍微违反视图-视图模型合同(即,视图模型是视图无关的)的情况下完成这个任务的方法。你可以使用System.Windows.InputKeyboard.FocusedElement,然后获取该元素的数据绑定,在视图模型中的搜索命令中执行你的搜索。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接