【问题标题】:Binding a button action to a Child ViewModel with Caliburn.Micro使用 Caliburn.Micro 将按钮操作绑定到子 ViewModel
【发布时间】:2017-05-10 00:08:03
【问题描述】:

这应该很容易,但它不适合我。我有一个名为 MainWindowView 的视图,其中包含一个名为 ChildView 的视图。 MainWindowView 有一个对应的 ViewModel,叫做 MainWindowViewModel,而 ChildView 有一个 ViewModel,叫做 ChildViewModel:

主窗口视图:

<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 文件夹中。为什么编辑命令不会触发?

【问题讨论】:

    标签: c# wpf mvvm caliburn.micro


    【解决方案1】:

    好吧,我要冒昧地说一下,根据我在 CM 方面的经验,从你所展示的内容来看,可能存在绑定错误。应该发生什么?请记住,CM 不是首先使用 WPF 开箱即用的视图。你能告诉我们你的引导程序吗?

    【讨论】:

    • 添加了引导程序。我收到一个绑定错误,但这对我来说毫无意义:Cannot create default converter to perform 'two-way' conversions between types 'XNameTest.ViewModels.ChildViewModel' and 'System.Windows.Visibility'.
    • 它不明白 (CM) 如何为您的 &lt;views:ChildView x:Name="ChildView"/&gt; 转换绑定,因此它会引发绑定错误。
    【解决方案2】:

    我可以通过将 MainWindowView 更改为

    来解决此问题
    <Grid>
        <ContentControl x:Name="ChildView" />
    </Grid>
    

    不知何故,Caliburn.Micro 无法将 ChildView 正确绑定到其 ViewModel。我很困惑,因为正在调用 ChildViewModel 构造函数。我猜 Caliburn.Micro 知道如何绑定 ContentControl,但不知道我的自定义视图。

    【讨论】:

    • 那是我接下来要去的地方。更正它知道 ContentControl,并且由于 contentcontrol 可以通过将 name 设置为与 ChildVM 关联的 VM 中的变量来采用任何类型,CM 知道将您的“视图”放入该 ContentControl。请记住 ViewModel First,除非您想切换到 View First,但它需要在页面声明中放置绑定。 &lt;Page cm.Model = "{Binding etc}" /&gt; 如果我没记错的话。
    • 感谢您的帮助!
    猜你喜欢
    • 2011-05-01
    • 2015-03-20
    • 1970-01-01
    • 2011-04-08
    • 2014-05-12
    • 2011-12-10
    • 2011-05-26
    • 2018-07-02
    • 1970-01-01
    相关资源
    最近更新 更多