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

San*_*tel 33 c# silverlight wpf mvvm devforce

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

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

我怎样才能访问网格?

nih*_*que 70

使用监督控制器模式.

读:

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

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

例:

1)定义的接口IView,其中ViewModel(VM)会跟View与所需的方法(S)

public interface IView 
{
    void AddTextBoxToGrid();
}
Run Code Online (Sandbox Code Playgroud)

2)从你的和实现方法继承代码ViewIViewIView.AddTextboxToGrid()

public partial class View: IView 
{
    public void AddTextBoxToGrid() 
    {  
        // implement here your custom view logic using standard code behind; 
    }
}
Run Code Online (Sandbox Code Playgroud)

3)将类型的属性添加IView到您的VM

public class ViewModel 
{
    public IView View { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

4)View属性设置VMViewIView 例如在DataContext.View =后面的代码中的实例作为IView; 或者在Caliburn中你可以使用IScreen.OnViewAttached覆盖方法)

 DataContext.View = this as IView; 
Run Code Online (Sandbox Code Playgroud)

5)在你的VM 电话中IView.AddTextboxToGrid()

public partial class View: IView 
{
    public View()
    {
        // access you VM by the 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; 
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 重要的是要强调在视图中从viewmodel创建依赖项也不是最纯粹的mvvm.当你使用`(DataContext as SomeViewModel)时,你的视图依赖于`SomeViewModel`,这可能是不可取的.你怎么看? (5认同)
  • 最好使用构造函数注入将`IVew`实例发送到`ViewModel`(我的意思是,'ViewModel`类'构造函数应该接受`IView`实例). (3认同)