2011-08-14 47 views
1

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

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

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

如果用户输入错误的日期值,我还需要禁用按钮。

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

在此先感谢。

注意:我修改这样的方式,用户可以输入日期手动此外,当开始日期文本框的重点是日历将显示为一个弹出,当他/她专注结束日期文本框中再次日历应用将显示阻止在开始日期文本框中选择/键入的日期。

对不起,对于延迟编辑。

回答

2

如果您需要根据用户的无效数据更新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,所以绿色的变化会更明显。

+0

关于事件应该在MVVM模式下处理的问题。任何如何感谢您的答案。 – Syed

+0

好,如果我正确理解你的问题,你不一定需要创建事件。例如,想要更改边框颜色是您想要作为样式而不是事件进行的操作。在无效输入上更改边框颜色为使用数据验证的良好状态。 –

+0

如果您在决定是否将事件处理置于代码后面或使用命令时遇到问题,请参阅以下有用问题:http://stackoverflow.com/questions/6137771/events-rather-than- commands-in-mvvm –

2

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

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

+0

所以,你的意思是说,在MVVM模式下,“视图”可以包含代码,也可以用于事件处理? – Syed

+0

当然。例如:一个列表框,其中单击所选项目或按下F2可让您编辑其文本,并且您可以按ESC取消编辑或按ENTER键保存。要做到这一点,你必须在视图中处理鼠标和按键事件。视图模型需要暴露一个'Text'属性和一个'IsEditingText'属性(ItemTemplate中的样式用于确定TextBox或TextBlock是否应该出现Text)。最终,这演变成一个自定义控件,用于实现“IEditableText”接口的视图模型。 –