VM中的Usercontrol事件或MVVM中的View

时间:2011-08-14 06:00:05

标签: wpf events mvvm

我在我的应用程序中使用MVVM模式。我有一些问题在哪里处理Usercontrol的事件。

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

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

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

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

提前致谢。

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

对于迟到的编辑感到抱歉。

2 个答案:

答案 0 :(得分:2)

如果您需要根据用户的无效数据更新用户界面的外观,则应查看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,因此对绿色的更改会更明显。

答案 1 :(得分:2)

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

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