SimpleChildWindows绑定到View Model

时间:2017-01-12 15:50:42

标签: c# wpf mvvm mvvm-light mahapps.metro

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

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

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

我没有成功使用SimpleChildWindows ...

所以......有可能吗?

3 个答案:

答案 0 :(得分:0)

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

我使用了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窗口的ViewModel看起来像


public class EntityCRUDWindowViewModel
{
    private readonly Entity entity;

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

你可以通过简单地在构造函数参数

中声明来获取窗口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参数。

答案 1 :(得分:0)

我可能会将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>

答案 2 :(得分:0)

好的,有时解决方案在我的鼻子底下,但我很难看到它......

所以这是我的解决方案:

 <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属性绑定到Viewmodel,其中&#34; Host&#34;我的孩子窗口(&#34;标题&#34;,&#34; IsOpen&#34;等)。

所有ChildWindows ViewModel都继承自一个类模板(显然是继承自ViewModelBase),其中包含一个Title以及一些特定于ChildWindows的其他属性。

我通过MVVM light Messenger进行通信,告诉&#34; Host&#34;哪个ViewModel以其名称显示,然后我读取它的&#34;标题&#34;并通过&#34; IsOpen&#34;打开Windows propertie:

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

这样,我就可以从&#34; CurrentViewModel&#34;或&#34; MainViewModel&#34;打开childWindows。

它工作得很好,视图只是绑定到ViewModelLocator中DataContext的标准Usercontrol。

对不起Heorhiy Pavlovych,我已经看到你在努力,但我们误解了......