首页 文章

WPF MvvM Prism

提问于
浏览
4

我是Wpf和Mvvm世界的新手,但我找到了几个例子,并发现有一些不同的方式来实例化模型 . 我想知道最好/最正确的方法 . 两种方式都使用Unity

我发了什么:

var navigatorView = new MainView();
navigatorView.DataContext = m_Container.Resolve<INavigatorViewModel>();
m_RegionManager.Regions["NavigatorRegion"].Add(navigatorView);

我做了什么:

var navigatorView = m_Container.Resolve<MainView>;
m_RegionManager.Regions["NavigatorRegion"].Add(navigatorView);

并且我更改了构造函数以接收viewmodel,因此我可以将datacontext指向它:

public MainView(NavigatorViewModel navigatorViewModel)
{
 this.DataContext = navigatorViewModel;
}

其他例子我发现了另一种方式:

...vm = new viewmodel 
...m = new model
v.model = vm;

获取/设置DataContext

干杯

2 回答

  • 0

    我喜欢Igor的建议,但没有viewmodel知道视图 . 我更喜欢我的依赖项去一个方向(View - > ViewModel - > Model) .

    我所做的是ViewModel-First,只是DataTemplate的viewmodel . 所以我这样做:

    MainViewModel mainViewModel = container.Resolve<MainViewModel>();
    
    region.Add(mainViewModel, "MainView");
    region.Activate(mainViewModel);
    

    添加了ViewModel - >使用WPF数据模板完成的视图映射(不过我认为这种方法不适用于Silverlight)

    App.xaml中:

    <Application.Resources>
         <DataTemplate DataType="{x:Type viewModels:MainViewModel}">
              <views:MainView />
         </DataTemplate>
    </Application.Resources>
    

    而已!我喜欢这种方法 . 我喜欢它的感觉就像魔术一样 . 它还具有以下优点:

    • 不必修改构造函数以适应映射

    • 不必在容器中注册IMyViewModel类型...您可以使用具体类型 . 我喜欢将我的注册保存到IViewRegistry或ILogger这样的应用程序服务......那些东西

    • 您可以使用作用域的资源更改映射到某个区域所在的特定视图(如果您想重用ViewModel但希望它们在应用程序的不同区域看起来不同,这很好

  • 8

    你在那里得到的是有道理的,在这两种情况下都是View-first方法来创建一个viewmodel . 即视图创建ViewModel . 在原始示例中,viewmodel是在视图外部创建的(有时也称为marriage pattern),但就我而言,这是一回事 - 创建视图会创建ViewModel .

    如果这符合您的需求坚持下去 . 您可能会考虑的另一种方法是ViewModel,其中viewmodel首先依赖于视图,如下所示:

    //In the bare-bones(i.e. no WPF dependencies) common interface assembly
    
    interfac IView {
      void ApplyViewModel(object viewmodel);
    }    
    
    interface IMainView : IView {
      //this interface can actually be empty.
      //It's only used to map to implementation.
    }
    
    //In the ViewModel assembly
    
    class MainViewModel {
      public MainViewModel(IMainView view) {
        view.ApplyViewModel(this);
      }
    }
    
    public partial class MainView : UserControl, IMainView {
      void ApplyViewModel(object viewmodel){
        DataContext = viewmodel;
      }
    }
    

    然后您可以像这样注入此视图:

    IRegion region = regionManager.Regions["MainRegion"];
    
    //This might look strange as we are resolving the class to itself, not an interface to the class
    //This is OK, we want to take advantage of the DI container 
    //to resolve the viewmodel's dependencies for us,
    //not just to resolve an interface to the class.
    MainViewModel mainViewModel = container.Resolve<MainViewModel>();
    
    region.Add(mainViewModel.View, "MainView");
    region.Activate(ordersView.View);
    

相关问题