WPF MVVM查看问题

时间:2011-06-20 11:46:26

标签: wpf mvvm mvvm-light

我想在我的项目中使用带有MVVM模式的WPF,但我对有关MVVM模式的一些观点感到困惑。请帮我澄清这些要点。

  1. 我正在使用DataTemplate for ViewModel,但我希望特定的控件能够以键盘为中心。
  2. 如何在ICommand执行后关注特定控件。
  3. 如何将焦点移至未经验证的控件。
  4. 是否有办法根据ViewModel属性值分隔DataTemplate。
  5. 如何在ICommand
  6. 之前验证所有控件
  7. 是否还有其他更好的方法可以使用MessageBox
  8. 询问ViewModel的任何确认

    此致 米坦

3 个答案:

答案 0 :(得分:1)

设置控件使用代码隐藏时的值。 MVVM并没有说不要使用代码隐藏。

在代码后面编写一个方法来设置焦点并从视图模型中调用此方法。

示例

public interface IView
{
  void setFoucs();
}

//Code Behind
public class MyWindow : Window, IView
{
  public void SetFoucs()
  {
    MyControl.Focus();
  }
}

public class ViewModel
{
  public IView _view { get; set; }
  public ViewModel(IView view)
  {
   _view = view;
  }

  public void SomeMethod()
  {
   _view.SetFocus();
  }

}

对于第4个问题 - 我认为您希望根据您的逻辑选择特定的数据模板。要实现这一点,请使用DataTemplateSelector类。

http://www.switchonthecode.com/tutorials/wpf-tutorial-how-to-use-a-datatemplateselector

答案 1 :(得分:1)

我强烈建议您查看caliburn(或caliburn.micro),它会公开不同的UImanager接口,以便您的viewmodel可以执行此类操作而不会损失单元可测试性。

答案 2 :(得分:1)

问题1:

不清楚你的意思/想要什么。通常,TabIndex控制应用程序中的焦点流,但是使用silverlight并不像在Windows窗体中那样容易配置。 Silverlight还可以自动设置标签序列。

但是,您应该注意,从Control继承的所有控件默认都会接收焦点。这包含一些可用作其他控件(例如ContentControl)容器的控件。此行为可能会导致一些不必要的影响。使用IsTabStop属性从Tab键顺序中删除这些控件。

问题2:

嗯,这取决于你想要你的应用程序的解耦方式(解耦越多越好)。 @pchajer的方法是这样做的一种方式,但是它将视图耦合到视图模型,并且这 - 虽然通过接口抽象 - 恕我直言并不是一个好主意,原因如下:

  1. 通常,视图模型是从定位器中提取的,以便实现可混合性。现在,如果我必须使用后面的代码将View传递给ViewModel,这可能会破坏它。如果它可以通过构造函数参数注入ViewModel会更好,这会破坏定位器。
  2. 代码变得不太可测试,因为它现在取决于视图。为了使其可测试,您需要将一个IView实现注入ViewModel,这会再次破坏定位器。
  3. 因此,我建议您在命令完成后使用Messaging向您的视图发送消息。然后,您可以在消息处理程序中设置焦点。但是,请注意您可能必须使用Dispatcher,因为消息处理程序可以在单独的线程中运行。

    问题3:

    您可以捕获控件上的BindingValidationError,然后设置焦点。再次注意可能的线程问题。

    问题4:

    不确定,但如果您想根据属性是否具有某个值来使用不同的DataTemplates,则TemplateSelector可能会对您有所帮助。请参阅http://www.switchonthecode.com/tutorials/wpf-tutorial-how-to-use-a-datatemplateselector

    问题5:

    触发属性更改事件时,通常在丢失焦点事件上验证控件。您的Model / ViewModel可以实现IDataError来进行验证,您可以从与命令关联的CanExecute方法访问此值。但是,您应该尽可能快地将代码保存在CanExecute方法中,因为此方法被频繁调用。

    问题6:

    您可以实现自己的窗口,提供自定义布局。但是,使用消息框要简单得多。您应该再考虑使用消息传递或对话服务(例如http://blog.roboblob.com/2010/01/19/modal-dialogs-with-mvvm-and-silverlight-4/)来解耦View和ViewModel。事实上,MVVMLight中甚至还有一个DialogMessage。