2009-11-14 2 views
4

Я начинаю с MVVM, и я начинаю понимать вещи. В настоящее время я экспериментирую с каркасом Cinch, хотя пока не готов к этому.
Я вводил ViewModels в представления, используя ссылку на ViewModel в кодовом коде представления, с свойством, имеющим [Dependency] на нем, и в setter он устанавливает DataContext в правильное представление, используя Единство. Я думал, что это трюк.Получение единства для разрешения просмотров в XAML

Я пытаюсь заставить свое приложение работать как единое окно с вложенными представлениями (в отличие от нескольких окон и занимающихся открытием \ закрытием) Я изменил свои представления из Windows на UserControls и добавил a главное окно. Это сработало, но ViewModel никогда не вводили, по-видимому, потому, что XAML не использует Container.Resolve для создания представления, поскольку, когда я создал представление и добавил его вручную в коде, используя Resolve, [Dependency] был создано.

Как настроить мое окно, так что если я добавлю представление через XAML или изменив представление в результате действия пользовательского интерфейса и т. Д., Он получит его через Unity, чтобы он мог работать своей магией?

ответ

3

Способ решения вашей проблемы состоит в том, чтобы сделать ваше окно также ViewModel, а ViewModels of UserControls предоставляет в качестве свойств на нем. Затем в вашем XAML для окна вы просто используете механизм привязки для привязки DataContexts UserControl к соответствующим свойствам вашего основного ViewModel. И поскольку эта основная ViewModel разрешена из контейнера Unity, она будет иметь все другие ViewModel-s, которые будут впрыскиваться по мере необходимости.

+0

Спасибо, я думаю, что у меня есть это сейчас. У меня есть с DataTemplate, который применяет соответствующий View для его отображения. Помещение класса ViewModel в качестве содержимого UserControl меня сбивало с толку: D – Kage

4

Эта проблема обычно решается с использованием регионов и RegionManager. В главном окне ViewModel создается набор Регионов и добавляется в RegionManager. Затем ViewModels могут быть разрешены и добавлены в коллекцию Region.Views.

В XAML регион обычно вводится с использованием свойства ItemsSource элемента ItemsControl, связанного с свойством region основного ViewModel.

Таким образом, в главном экране ViewModel вы бы что-то вроде этого:

public class TestScreenViewModel 
{ 
    public const string MainRegionKey = "TestScreenViewModel.MainRegion"; 

    public TestScreenViewModel(IUnityContainer container, IRegionManager regionManager) 
    { 
     this.MainRegion = new Region(); 
     regionManager.Regions.Add(MainRegionKey, this.MainRegion); 
    } 

    public Region MainRegion { get; set; } 
} 

Это будет Решенный нормально в вашем IModule

 #region IModule Members 

    public void Initialize() 
    { 
     RegisterViewsAndServices(); 

     var vm = Container.Resolve<SelectorViewModel>(); 
     var mainScreen = Container.Resolve<TestScreenViewModel>(); 
     mainScreen.MainRegion.Add(vm); 

     var mainView = ContentManager.AddContentView("Test harness", mainScreen); 
    } 

    #endregion 

И в XAML представление шаблона ищет что-то вроде

<DataTemplate DataType="{x:Type TestModule:TestScreenViewModel}"> 
    <ScrollViewer ScrollViewer.VerticalScrollBarVisibility="Auto"> 
     <StackPanel> 
      <ItemsControl ItemsSource="{Binding Path=MainRegion.Views}" /> 
     </StackPanel> 
    </ScrollViewer> 
</DataTemplate> 
Смежные вопросы