如何在viewmodel中访问mvvm模型中的控件?

时间:2013-01-09 13:24:25

标签: c# wpf silverlight mvvm devforce

我有一个WPF窗口,在那个窗口中我有一个网格。

我使用M-V-VM模型,我想在代码中动态地将一个TextBox添加到网格中(在viewmodel中)

如何访问网格?

4 个答案:

答案 0 :(得分:68)

使用监督控制器模式。

<强>读:

CaliburnMicro 的示例实现此处显示了MVVM框架(对于所有其他框架也是如此 - 或者如果您自己做MVVM,可以手动完成):

http://drc.ideablade.com/devforce-2012/bin/view/Documentation/cocktail-tutorial-talk-to-view

示例:

1)定义界面IView ,其中ViewModelVM)将与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,请执行以下步骤:

  1. 使ViewModel继承自接口IViewAware;您将实现此接口的两个方法AttachView和GetView。

  2. 使用View类型定义变量以获取对View

  3. 的引用
  4. 请参阅以下详细信息:

    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;
    }
    
  5. 稍后您可以通过v访问View上的单个元素,例如v.txtName =&#34; John&#34 ;;等...