回答
使用监督控制器模式。
阅读:
例实施如下所示CaliburnMicro MVVM框架(将努力同所有其他框架 - 或者你可以通过手,如果你正在做MVVM自己做这件事):
http://drc.ideablade.com/devforce-2012/bin/view/Documentation/cocktail-tutorial-talk-to-view
实施例:
1)定义接口IView
其中ViewModel
()将从你的IView
交谈View
与所需的方法(或多个)
public interface IView
{
void AddTextBoxToGrid();
}
2)继承代码后面View
和实施IView.AddTextboxToGrid()
方法
public partial class View : IView
{
public void AddTextBoxToGrid()
{
// implement here your custom view logic using standard code behind;
}
}
3)添加类型的属性210你
public class ViewModel
{
public IView View { get; set; }
}
4)设置View
财产上到View
实例作为IView
例如在代码背后DataContext.View =这是IView;或者在Caliburn中,您可以使用IScreen。OnViewAttached覆盖方法)
public partial class View : IView
{
public View()
{
// access you VM by strategy of your framework or choice - this example is when you store your VM in View's DataContext
(DataContext as ViewModel).View = this as IView;
}
public void AddTextBoxToGrid()
{
// implement here your custom view logic using standard code behind;
}
}
5)在您的通话IView.AddTextboxToGrid()
public class ViewModel
{
public IView View { get; set; }
public void AddTextBoxToGrid()
{
if (View == null) return;
View.AddTextBoxToGrid()
}
}
最好使用构造函数注入来将'IVew'实例发送到'ViewModel'(我的意思是,'ViewModel'类'构造函数应该接受'IView'实例)。 –
优秀的答案...... :)谢谢@nihique – ankurtr
需要强调的是,在视图中从viewmodel创建依赖关系并不是最纯粹的mvvm。当你使用'(DataContext作为SomeViewModel)'时,你的视图变得依赖于'SomeViewModel',这可能是不希望的。你怎么看? – heltonbiker
您也可以在视图后面的代码中使用View的DataContext(它是ViewModel),并将文本框添加到网格中。这会更有意义。
如果您在网格中为您的XAML文件命名,您将能够立即访问后面代码中的网格。
您应该将您的创建代码移动到View,并且ViewModel应该在应该调用它时通知视图。
要VIEWMODE拿出像
不要你的代码隐藏和捕捉目标控制放弃视图模型之前使用事件处理程序的xaml instade
This为您提供一个新层,你可以建立自己的体系结构是这样 MVVM => MV(C)VM
如果使用的是卡利微,执行以下步骤:
使视图模型从接口
IViewAware
继承;你将实现这个接口的两个方法AttachView和GetView。定义类型视图的变量获得参考查看
请参见下面的细节:
private SomeViewClass v; public void AttachView(object view, object context = null) { v = view as BomView; if (ViewAttached != null) ViewAttached(this, new ViewAttachedEventArgs() { Context = context, View = view }); } public object GetView(object context = null) { return v; }
以后你可以通过在浏览访问单个元素v例如v.txtName =“John”;等等...
BomView = SomeViewClass。视图类的名称。 –
- 1. 如何从MVVM中的ViewModel访问用户控件(工具栏)?
- 2. 如何访问控制器中的viewModel
- 3. MVVM - 如何将ViewModel包装在ViewModel中?
- 4. MVVM模型到ViewModel通信
- 5. WPF如何从ViewModel访问控件
- 6. 从ViewModel访问MVVM设计模式中的this.content
- 7. 如何访问Knockout组件中的viewModel?
- 8. MVVM模式,ViewModel DataContext问题
- 9. Silverlight与MVVM:如何从视图访问ViewModel的事件?
- 10. 由模型事件触发的ViewModel中的WPF MVVM PropertyChanged通知
- 11. 如何获取ViewModel(MVVM)中的控件句柄
- 12. 如何在XAML中访问ViewModel的DependencyProperties?
- 13. 如何访问WPF/MVVM中的子用户控件的DependencyProperty?
- 14. 如何在zend框架中访问控制器中的模型?
- 15. 在MVVM Light中访问其他视图模型中的属性
- 16. 如何访问控制器上的ViewModel
- 17. 正在访问总是违反MVVM模式的代码中的ViewModel?
- 18. MVVM - 模型和ViewModel之间的区别
- 19. 在ViewModel中模型属性的WPF绑定[MVVM]
- 20. MVVM Binding - 在View中创建控件,如何绑定ViewModel中的属性?
- 21. 如何从ViewModel(MVVM Light工具包)中访问ViewControl中的UserControl(MediaElement)
- 22. 如何在CakePHP中访问不属于控制器的模型
- 23. 使用WPF MVVM从ViewModel访问Validation.HasError
- 24. wpf mvvm ..在viewmodel中访问视图元素
- 25. 如何验证MVVM模式中ViewModel中的数据?
- 26. MVVM使用INotifyPropertyChanged模型不通知ViewModel
- 27. 嵌套控件的ViewModel不在Catel MVVM中刷新WPF
- 28. 如何访问ViewModel中的方法?
- 29. 如何访问我的viewmodel中日历控件中的选定日期?
- 30. 如何在MVVM中实现模型
在走下这条路线之前,我会确保它绝对必要,通常是从视图模型访问视图的不良做法,除非绝对没有其他选择。 – BenjaminPaul
本杰明保罗说了些什么。使用MVVM时,您不会从ViewModel添加控件。使用绑定来完成这件事。 –
是的,我知道这一点,正是我的意思。然而,我有时需要参考视图模型中的控件来迎合不支持常规绑定的控件。那就是我所指的场景。 – BenjaminPaul