简单的子窗口绑定到 Viewmodel

SimpleChildWindows binded to View Model

我正在使用 MVVM Light、MahApps 和 SimpleChildWindows。

我希望能够在模式弹出窗口中创建一个 CRUD 表单。

此 CRUD 表单必须绑定到它自己的 ViewModel 并由另一个 ViewModel 中的命令调用。

我用 SimpleChildWindows 没成功...

所以...可能吗?

我是如何利用依赖注入为自己解决类似问题的:

我使用了 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 */
    }
}

CRUD window 的 ViewModel 看起来像


public class EntityCRUDWindowViewModel
{
    private readonly Entity entity;

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

你可以得到 window EntityCRUDWindow 的实例并在 ConsumerViewModel 或任何其他 ViewModel 中使用它,只需在构造函数参数中声明


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; }
}

因此,您可以在两个视图模型的构造函数参数中放置您需要的任何依赖项,请记住 Entity entity 参数必须存在于 EntityCRUDWindowViewModel.

我可能会将 DataTemplate 添加到资源中,只要您将 Content 绑定到某个 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>

好吧,有时解决方案就在我眼皮底下,但我很难看到它...

所以这是我的解决方案:

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

CurrentWindowsViewModel 绑定到一个 UserControl,它完全适合我的 SimpleChildWindows.

的 Content 属性

但是我必须将所有 ChildWindows 属性绑定到 "Host" 我的 childwindows ("Title", "IsOpen"等)。

所有 ChildWindows ViewModel 都继承自 class 模板(显然继承自 ViewModelBase),带有标题和一些特定于 Child[ 的其他属性=38=].

我通过 MVVM light Messenger 进行通信,告诉 "Host" 要显示哪个 ViewModel 的名称,然后我读取它的 "Title" 并通过 [=32 打开 Windows =] 属性:

        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));
        }

这样,我就可以从 "CurrentViewModel" 或 "MainViewModel".

打开 childWindows

效果很好,视图只是绑定到 ViewModelLocator 中的 DataContext 的标准用户控件。

抱歉,Heorhiy Pavlovych,我看到你很努力,但我们误解了...