简单的子窗口绑定到 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,我看到你很努力,但我们误解了...
我正在使用 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,我看到你很努力,但我们误解了...