我想在我的项目中使用带有MVVM模式的WPF,但我对有关MVVM模式的一些观点感到困惑。请帮我澄清这些要点。
此致 米坦
答案 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的方法是这样做的一种方式,但是它将视图耦合到视图模型,并且这 - 虽然通过接口抽象 - 恕我直言并不是一个好主意,原因如下:
因此,我建议您在命令完成后使用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。