【问题标题】:Usercontrol events in VM or View in MVVMVM 中的用户控件事件或 MVVM 中的视图
【发布时间】:2011-08-14 06:00:04
【问题描述】:

我在我的应用程序中使用 MVVM 模式。我在处理 Usercontrol 的事件时遇到了一些问题。

我有一个名为 DatePicker 的用户控件,其中包含两个文本框(用于开始日期和结束日期),以及从模型中获取特定日期范围内数据的按钮。

当我关注任何文本框时,我需要更改其边框颜色(比如绿色)。当用户再次输入错误的日期值时,我需要用红色更改边框颜色。

如果用户输入了错误的日期值,那么我也需要禁用该按钮。

处理这些事件的最佳做法是什么?

提前致谢。

注意:我修改了应用程序,用户也可以手动输入日期,当开始日期文本框聚焦时,日历将显示为弹出窗口,当他/她聚焦结束时日期文本框再次显示日历,并阻止在开始日期文本框中选择/键入的日期。

抱歉编辑晚了。

【问题讨论】:

    标签: wpf events mvvm


    【解决方案1】:

    如果您需要根据用户的无效数据更新 UI 的外观,您应该查看Data Validation。这是另一个关于该主题的useful link。

    要更改边框颜色为绿色,您应该考虑使用样式。不幸的是,我目前无法为您测试,但您应该查看FocusVisualStyle 的属性。

    MSDN 文档说:

    获取或设置启用外观自定义的属性, 效果,或将适用于此的其他风格特征 捕获键盘焦点时的元素。

    希望对您有所帮助!当我在安装了 VS 的计算机上运行时,我会尝试看看是否可以一起使用 FocusVisualStyle 属性获得一个不错的示例。我还没有使用它,所以这应该很有趣。 :o)

    编辑:

    好的,所以对于“聚焦,突出显示TextBox 边框绿色”,您可以使用与此非常相似的样式。

       <Window.Resources>
            <Style TargetType="TextBox">
                <Style.Triggers>
                    <Trigger Property="IsFocused" Value="True">
                        <Setter Property="BorderBrush" Value="Green" />
                        <Setter Property="BorderThickness" Value="2" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </Window.Resources>
    

    我将BorderThickness 增加到 2,这样绿色的变化会更加明显。

    【讨论】:

    • 关于在 MVVM 模式中应该在哪里处理事件的问题。无论如何感谢您的回答。
    • 好吧,如果我正确理解您的问题,您不一定需要创建事件。例如,想要改变边框颜色是你想要做的一种风格,而不是一个事件。将无效输入上的边框颜色更改为红色是使用数据验证的好情况。
    • 如果您在决定是否将事件处理放在代码后面或使用命令时遇到问题,您应该检查一个有用的问题:stackoverflow.com/questions/6137771/…
    【解决方案2】:

    处理您所描述的事件的最佳做法是不使用事件。使用样式更改焦点元素的视觉外观、启用/禁用按钮的命令以及在输入错误数据时更改控件外观的验证。

    用户控件中的事件仍有用例。当需要它们时,通常最好的做法是将事件处理程序放在控件的代码隐藏中,并通过在DataContext 上设置已知属性使事件处理程序与视图模型通信。如果您这样做,最好创建一个接口,这将阐明控件和视图模型之间互操作的性质,并限制用户控件需要了解与其通信的对象的内容。

    【讨论】:

    • 所以你的意思是说,在 MVVM 模式中,“视图”也可以包含用于事件处理的代码?
    • 当然。一个例子:一个列表框,单击选定的项目或按 F2 可以编辑其文本,您可以按 ESC 中止编辑或按 ENTER 保存。为此,您必须在视图中处理鼠标向上和按键事件。视图模型需要公开一个Text 属性和一个IsEditingText 属性(ItemTemplate 中的样式用于确定TextBox 或TextBlock 是否应该呈现Text)。最终这演变成一个自定义控件,用于实现IEditableText 接口的视图模型。
    猜你喜欢
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 2017-11-14
    • 2011-07-03
    • 2016-08-08
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    相关资源
    最近更新 更多