2017-01-12 4 views
0

Я использую MVVM Light, MahApps и SimpleChildWindows.SimpleChildWindows, связанный с View Model

Я хочу, чтобы создать форму CRUD в модальном всплывающем окне.

Эта форма CRUD должна быть привязана к собственной ViewModel и вызвана командой в другой ViewModel.

мне не удастся сделать это с SimpleChildWindows ...

Итак ... Возможно ли это?

ответ

0

Ok иногда решение находится под моим носом, но я изо всех сил, чтобы увидеть его ...

Так вот мое решение:

<Grid> 
    <Grid > 
     <UserControl Content="{Binding Path=CurrentViewModel}"/> 
    </Grid> 
    <simpleChildWindow:ChildWindow IsOpen="{Binding OpenChildWindows}" 
            Title="{Binding TitleChildWindows}" 
            Content="{Binding CurrentWindowsViewModel }"/> 
</Grid> 

CurrentWindowsViewModel является переплетены в UserControl, который прекрасно вписывается в контентной свойство моего S impleChildWindows.

Однако я должен привязать все свойства ChildWindows к Viewmodel, которые «Host» имеют дочерние окна («Title», «IsOpen» и т. Д.).

Все объекты ChildWindows ViewModel наследуют от шаблона класса (который явно наследуется от ViewModelBase) с титром Title и, возможно, некоторыми другими свойствами, специфичными для ChildWindows.

Я общаюсь через MVVM свет Messenger, чтобы сказать «Host», который ViewModel для отображения его имени, а затем я прочитал его «Название» и откройте Windows, с помощью СВОЙСТВ «IsOpen»:

 private void ReceiveMessage(EnumViewModelNames viewName) 
     { 
     var selectedViewModel = ViewModelList.Where(x => x.ViewModelName == viewName).SingleOrDefault(); 
     if (selectedViewModel is TemplateWindowsViewModel) 
     { 
      TitleChildWindows = (selectedViewModel as TemplateWindowsViewModel).Title; 
      OpenChildWindows = true; 
      CurrentWindowsViewModel = (selectedViewModel as TemplateWindowsViewModel); 
     } 
     else if (selectedViewModel != null) 
     { 
      CurrentViewModel = selectedViewModel; 
     } 
     Messenger.Default.Unregister<EnumViewModelNames>(this, (action) => ReceiveMessage(action)); 
     } 

Таким образом, я могу открыть childWindows из «CurrentViewModel» или «MainViewModel».

Он работает очень хорошо, и представление представляет собой просто стандартное Usercontrol, связанное с DataContext в ViewModelLocator.

Извините, Георгий Павлович, я видел, что вы пытались изо всех сил, но мы неправильно поняли ...

+0

Здравствуйте, Speuline, Этот пост старый, но для меня он новый :), у меня такая же проблема, но я не могу добиться успеха. Можете ли вы предоставить мне пример вашего примера работы. С наилучшими пожеланиями. Jolynice – jolynice

+0

Привет, вы используете библиотеку SimpleChildWindows? – Speuline

+0

Здравствуйте, Speuline, Да, я использую SimpleChildWindows Library. Я новичок в WPF :(, вы можете мне помочь, пожалуйста. Спасибо. – jolynice

0

Как решить подобную проблему для себя, пользуясь Dependency Injection:

Я Unity и зарегистрировал зависимость в 'Func':


public partial class App 
{ 
    protected override void OnStartup(StartupEventArgs e) 
    { 
     base.OnStartup(e); 
     IUnityContainer container = new UnityContainer(); 
     container.RegisterType<EntityCRUDWindowViewModel>(); 
     container.RegisterType<ConsumerViewModel>(); 
     container.RegisterInstance<Func<Entity, EntityCRUDWindow>>(entity => new EntityCRUDWindow(){DataContext=container.Resolve<EntityCRUDWindowViewModel>(new ParameterOverride("entity", new InjectionParameter<Entity>(entity)))); 
     /* whatever goes here */ 
    } 
} 

ViewModel для окна CRUD выглядит


public class EntityCRUDWindowViewModel 
{ 
    private readonly Entity entity; 

    public EntityCRUDWindowViewModel(Entity entity) 
    { 
     this.entity = entity; 
    } 
} 

и вы можете получить экземпляр окна EntityCRUDWindow и использовать его в ConsumerViewModel или любом другом ViewMod эль просто объявляя в параметре конструктора


public class ConsumerViewModel 
{ 
    public ConsumerViewModel(Func<Entity, EntityCRUDWindow> entityCrudWindowFactory) 
    { 
     this.WhateverCommand = new DelegateCommand(
      () => 
      { 
       Entity someEntity = null; //or whatever 
       entityCrudWindowFactory(someEntity).ShowDialog(); 
      }); 
    } 

    public ICommand WhateverCommand { get; } 
} 

Таким образом, вы можете поместить какую-либо зависимость, что нужно в параметрах конструктора обоих ViewModels, только имея в виду, что Entity entity параметр должен присутствовать в EntityCRUDWindowViewModel.

+0

Извините, но я не вижу, как это поможет мне ... Я хочу иметь модальный диалог CRUD. Ваш код позволяет создать CRUD ViewModel. – Speuline

+0

Это способ сделать окно доступным из любого места. Мой код не создает viewmodel, он сам создает вид (окно в этом случае) –

+0

Я думаю, что я плохо объяснил, что я хотел, может быть, мое «редактирование» объяснит лучше. – Speuline

0

я бы, вероятно, добавить DataTemplate к ресурсам и которые будут оказывать всякий раз, когда вы свяжете содержание какой-то экземпляр CrudViewModelType



    <Grid> 
     <Grid.Resources> 
      <DataTemplate DataType="{x:Type whateverNs:MyCrudViewModelType}"> 
       <UserControl Content="{Binding}"/> 
      </DataTemplate> 
     </Grid.Resources> 
     <ContentControl Content={Binding CurrentCrudViewModel}></ContentControl> 
     <simpleChildWindow:ChildWindow IsOpen="{Binding OpenChildWindows}" Content="{Binding MyCrudViewModel}"/> 
    </Grid>