【问题标题】:How to present actions to screen conductor from child view?如何从子视图中呈现动作以屏蔽指挥?
【发布时间】:2014-09-04 03:23:19
【问题描述】:

我正在使用 Caliburn.Micro 构建我的第一个 WPF 应用程序,一个类似向导的应用程序。我在思考如何连接屏幕的正确设计时遇到了一些麻烦。我有一个Conductor<Screen> 作为我的外壳视图模型,然后我在我的第一个屏幕上执行ActivateItem。到目前为止,一切都很好。然而,从这里开始,屏幕应该如何最好地告诉指挥者在这个屏幕上可以执行哪些操作(例如下一个、上一个、取消等),以及针对给定的操作要做什么?

我看到的所有示例都相当简单,没有包含这些问题。我当然可以让每个屏幕定义它自己的按钮,然后让指挥为每个屏幕订阅一个事件处理程序,但它会变得非常混乱(大约有 10 个屏幕,每个屏幕上有 1 到 3 个按钮)。

我尝试让屏幕显示 AvailableActions 属性,shell 可以绑定到该属性并显示正确的按钮,但我想不出一种方法将按钮连接到相应的屏幕而不增加很多混乱.

就我理解的设计理念而言,我应该避免让屏幕的视图模型相互了解,而应该是指挥者控制流动。然而,我不希望指挥必须在每个屏幕上的按钮可用的指挥中都有特殊的案例代码。我在这方面是正确的吗?在这种情况下,我应该如何实现这两个目标?

【问题讨论】:

    标签: wpf caliburn.micro


    【解决方案1】:

    习惯上使用Page Class 来实现类似向导的 应用程序:

    <Page
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        x:Class="SDKSample.HomePage">
      Hello, from the XBAP HomePage!
    </Page>
    

    您可以添加Hyperlink 元素以在页面之间导航:

    <Hyperlink NavigateUri="UriOfPageToNavigateTo.xaml">
      Navigate to Another Page
    </Hyperlink>
    

    请阅读 MSDN 上的Navigation Overview 页面了解更多信息。

    【讨论】:

    • 您好,感谢您的回答。不幸的是,我们所有的 WPF 应用程序都使用 Caliburn 是公司的限制。不过,我认为我的主要问题在于设计,所以让我们围绕您的示例进行讨论。让页面的视图模型知道下一个/上一个页面是什么被认为是一个好的设计?如果有分支,我需要应用一些逻辑来决定下一页怎么办?
    • 每个Page 都应该有自己的视图模型,并且这些视图模型应该相互了解。但是,习惯上拥有一个了解子视图模型的父视图模型。
    • 谢谢,我觉得这也是合理的。但是,这与您的示例并不真正吻合,您的 Hyperlink 元素引用了下一页(所以不在视图模型中,而是在视图中,但我认为那里的推理是一样的?)。那么如何设置NavigateUri 属性呢?
    • 如果您按照我提供的链接进行操作,那么您会看到代码来自链接页面。此外,如果您查看过 MSDN 上的 HyperlinkButton.NavigateUri Property 页面,那么您会发现它是可绑定的,因此每个 Page不需要彼此了解。请阅读链接页面了解更多信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 2011-10-17
    • 2013-08-20
    • 2017-05-09
    • 1970-01-01
    相关资源
    最近更新 更多