使用 Caliburn.Micro 将按钮操作绑定到子 ViewModel
Binding a button action to a Child ViewModel with Caliburn.Micro
这应该很容易,但它不适合我。我有一个名为 MainWindowView 的视图,其中包含一个名为 ChildView 的视图。 MainWindowView 有一个对应的 ViewModel,称为 MainWindowViewModel,而 ChildView 有一个名为 ChildViewModel 的 ViewModel:
主窗口视图:
<Grid>
<views:ChildView x:Name="ChildView"/>
</Grid>
MainWindowViewModel:
public MainWindowViewModel()
{
ChildView = new ChildViewModel();
}
子视图:
<Grid>
<Button Content="Edit" x:Name="Edit"/>
</Grid>
子视图模型:
public class ChildViewModel
{
public void Edit()
{
}
public ChildViewModel()
{
}
编辑:
AppBootstrapper:
public class AppBootstrapper : BootstrapperBase
{
private SimpleContainer container;
public AppBootstrapper()
{
Initialize();
}
protected override void Configure()
{
container = new SimpleContainer();
container.Instance(container);
container
.Singleton<IWindowManager, WindowManager>()
.Singleton<IEventAggregator, EventAggregator>();
container.PerRequest<MainWindowViewModel>();
}
protected override void OnStartup(object sender, StartupEventArgs e)
{
DisplayRootViewFor<MainWindowViewModel>();
}
protected override object GetInstance(Type service, string key)
{
return container.GetInstance(service, key);
}
protected override IEnumerable<object> GetAllInstances(Type service)
{
return container.GetAllInstances(service);
}
protected override void BuildUp(object instance)
{
container.BuildUp(instance);
}
protected override void OnUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
e.Handled = true;
MessageBox.Show(e.Exception.Message, "An error as occurred", MessageBoxButton.OK);
}
}
我可能会补充说,视图位于根级别的 Views 文件夹中,视图模型位于根级别的 ViewModels 文件夹中。为什么编辑命令不会触发?
好吧,我要冒昧地说,根据我使用 CM 的经验,从你所展示的内容来看,可能存在绑定错误。应该发生什么?请记住,CM 不是开箱即用的 WPF 视图。你能告诉我们你的引导程序吗?
我可以通过将 MainWindowView 更改为
来解决这个问题
<Grid>
<ContentControl x:Name="ChildView" />
</Grid>
不知何故 Caliburn.Micro 无法将 ChildView 正确绑定到它的 ViewModel。我很困惑,因为正在调用 ChildViewModel 构造函数。我想 Caliburn.Micro 知道如何绑定 ContentControl,但不知道我的自定义视图。
这应该很容易,但它不适合我。我有一个名为 MainWindowView 的视图,其中包含一个名为 ChildView 的视图。 MainWindowView 有一个对应的 ViewModel,称为 MainWindowViewModel,而 ChildView 有一个名为 ChildViewModel 的 ViewModel:
主窗口视图:
<Grid>
<views:ChildView x:Name="ChildView"/>
</Grid>
MainWindowViewModel:
public MainWindowViewModel()
{
ChildView = new ChildViewModel();
}
子视图:
<Grid>
<Button Content="Edit" x:Name="Edit"/>
</Grid>
子视图模型:
public class ChildViewModel
{
public void Edit()
{
}
public ChildViewModel()
{
}
编辑:
AppBootstrapper:
public class AppBootstrapper : BootstrapperBase
{
private SimpleContainer container;
public AppBootstrapper()
{
Initialize();
}
protected override void Configure()
{
container = new SimpleContainer();
container.Instance(container);
container
.Singleton<IWindowManager, WindowManager>()
.Singleton<IEventAggregator, EventAggregator>();
container.PerRequest<MainWindowViewModel>();
}
protected override void OnStartup(object sender, StartupEventArgs e)
{
DisplayRootViewFor<MainWindowViewModel>();
}
protected override object GetInstance(Type service, string key)
{
return container.GetInstance(service, key);
}
protected override IEnumerable<object> GetAllInstances(Type service)
{
return container.GetAllInstances(service);
}
protected override void BuildUp(object instance)
{
container.BuildUp(instance);
}
protected override void OnUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
e.Handled = true;
MessageBox.Show(e.Exception.Message, "An error as occurred", MessageBoxButton.OK);
}
}
我可能会补充说,视图位于根级别的 Views 文件夹中,视图模型位于根级别的 ViewModels 文件夹中。为什么编辑命令不会触发?
好吧,我要冒昧地说,根据我使用 CM 的经验,从你所展示的内容来看,可能存在绑定错误。应该发生什么?请记住,CM 不是开箱即用的 WPF 视图。你能告诉我们你的引导程序吗?
我可以通过将 MainWindowView 更改为
来解决这个问题<Grid>
<ContentControl x:Name="ChildView" />
</Grid>
不知何故 Caliburn.Micro 无法将 ChildView 正确绑定到它的 ViewModel。我很困惑,因为正在调用 ChildViewModel 构造函数。我想 Caliburn.Micro 知道如何绑定 ContentControl,但不知道我的自定义视图。