我正在使用MVVM Light,MahApps和SimpleChildWindows。
我希望能够在模态弹出窗口中创建CRUD表单。
此CRUD表单必须绑定到自己的ViewModel,并由另一个ViewModel中的命令调用。
我没有成功使用SimpleChildWindows ...
所以......有可能吗?
答案 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,我已经看到你在努力,但我们误解了......