UWP,C#,Caliburn.Micro Bubbling ....如何泡泡?

时间:2017-08-17 07:57:03

标签: uwp caliburn.micro

这是我尝试Caliburn.Micro + UWP的简单测试项目。

enter image description here

有2个按钮。

  • 保存:它在HelloViewModel上执行操作。 (它奏效了:)。
  • 保存泡泡:我希望它对ParentViewModel进行操作但不能正常工作...... :(
你能告诉我你的想法吗?为什么???

Here is project file on Github.

首先是HelloViewMode代码。这很好。

public void Save()
    {
        Debug.WriteLine("Click Save");
    }

第二个是ParentViewMode代码。这不起作用......我想知道......

public void BubbleSave()
    {
        Debug.WriteLine("Click BubbleSave");
    }

和HelloView XAML代码在这里。

        <Button x:Name="Save" Content="SaveButton" Margin="30"/>
        <Button x:Name="BubbleSave" Content="Bubble SaveButton" Margin="30"/>

我希望被称为BubbleSave ....但不能被称为。

感谢您帮助我。

1 个答案:

答案 0 :(得分:2)

基本上你想要通知父母按下了BubbleSave。您的孩子班级对您的父母一无所知,因此无法打电话给您。这里的解决方案是创建接口或事件。我可以看到你使用依赖注入。

你的HelloViewModel需要了解一下它的父母。它需要知道BubbleSave存在,因此您可以创建interface:

public interface IBubbleSave {
    void BubbleSave();
}

并将其分配给ParentViewModel

public class ParentViewModel: Conductor<object>, IBubbleSave

孩子应该要求这个界面能够调用该方法。

public class HelloViewModel : Screen
{
    private readonly IBubbleSave _bubbleSave;
    public HelloViewModel(IBubbleSave bubbleSave) {
         _bubbleSave = bubbleSave;
    }
    public void Save()
    {
        Debug.WriteLine("Click Save");
    }
    public void BubbleSave()
    {
        _bubbleSave.BubbleSave();
    }
}

您还必须在IBubbleSave

中注册App.xaml.cs的相关性

第二种方法是使用事件。

您的HelloViewModel可以公开父订阅的事件:

public class HelloViewModel : Screen
{
    public event EventHandler BubbleSavePressedEvent;
    public void Save()
    {
        Debug.WriteLine("Click Save");
    }

    public void BubbleSave()
    {
        BubbleSavePressedEvent?.Invoke();
    }
}

public class ParentViewModel : Conductor<object>
{
    HelloViewModel _helloViewModel;

    public ParentViewModel(HelloViewModel helloViewModel)
    {
        _helloViewModel = helloViewModel;
        _helloViewModel.BubbleSavePressedEvent += BubbleSave;

        ActivateItem(_helloViewModel);
    }

    public void BubbleSave()
    {
        Debug.WriteLine("Click BubbleSave");
    }
}