我有一个WPF窗口,在那个窗口中我有一个网格。
我使用M-V-VM模型,我想在代码中动态地将一个TextBox添加到网格中(在viewmodel中)
如何访问网格?
答案 0 :(得分:68)
使用监督控制器模式。
<强>读:强>
CaliburnMicro 的示例实现此处显示了MVVM框架(对于所有其他框架也是如此 - 或者如果您自己做MVVM,可以手动完成):
http://drc.ideablade.com/devforce-2012/bin/view/Documentation/cocktail-tutorial-talk-to-view
示例:强>
1)定义界面IView
,其中ViewModel
(VM
)将与View
与所需方法对话
public interface IView
{
void AddTextBoxToGrid();
}
2)从View
继承IView
后面的代码并实施IView.AddTextboxToGrid()
方法
public partial class View : IView
{
public void AddTextBoxToGrid()
{
// implement here your custom view logic using standard code behind;
}
}
3)将IView
类型的媒体资源添加到VM
public class ViewModel
{
public IView View { get; set; }
}
4)将View
上的VM
属性设为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)在VM
致电IView.AddTextboxToGrid()
public class ViewModel
{
public IView View { get; set; }
public void AddTextBoxToGrid()
{
if (View == null) return;
View.AddTextBoxToGrid()
}
}
答案 1 :(得分:3)
您应该将创建代码移动到View,而ViewModel应该只在应该调用时通知视图。
答案 2 :(得分:1)
您还可以在视图后面的代码中使用View的DataContext(ViewModel),并将文本框添加到网格中。这会更有意义。
如果您在XAML文件中为网格指定了名称,则可以立即访问后面代码中的网格。
答案 3 :(得分:-1)
如果您使用的是Caliburn Micro,请执行以下步骤:
使ViewModel继承自接口IViewAware
;您将实现此接口的两个方法AttachView和GetView。
使用View类型定义变量以获取对View
请参阅以下详细信息:
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访问View上的单个元素,例如v.txtName =&#34; John&#34 ;;等...