0

嗨,我想传递文本框quantidadehoras.Text;datahorado.SelectedDate;correto.Desenvolvedor(from childwindow) 到名为 datagridhorastotais 的主页中的网格,但我无法将 itemsource 设置为“teste”窗体子窗口......有什么想法吗?这是子窗口的代码

     public partial class ChildWindow2 : ChildWindow, INotifyPropertyChanged
{
    public class Horas : INotifyPropertyChanged
    {
        private string quantidadehoras;
        private DateTime? datahora;
        private string desenvolvedor;

        public string Quantidadehoras
        {
            get
            {
                return quantidadehoras;
            }
            set
            {
             quantidadehoras = value;
                NotifyPropertyChanged("Quantidadehoras");
            }
        }


        public DateTime? Datahora
        {
            get
            {
                return datahora;
            }

            set
            {
                datahora = value;
                NotifyPropertyChanged("DataHora");
            }
        }
        public string Desenvolvedor
        {
            get
            {
                return desenvolvedor;
            }
            set
            {
                desenvolvedor = value;
                NotifyPropertyChanged("Desenvolvedor");
            }
        }
        #region
        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }

        public class Horas2 : ObservableCollection<Horas>
        {
            public Horas2()
            {
            }
        }
    }


    #endregion
    public ChildWindow2()
    {
        InitializeComponent();
    }

    public class quadrodehorarios : ObservableCollection<ChildWindow2>, INotifyPropertyChanged

  {

    }
    private void OKButton_Click(object sender, RoutedEventArgs e)
    {

        Horas2 teste= new Horas2();
        Horas correto = new Horas();
        correto.Quantidadehoras = textboxquantidadehoras.Text;
        correto.Datahora = datahorado.SelectedDate;
        correto.Desenvolvedor =textboxDesenvolvedor.Text;
        this.DialogResult = true;

    }

    private void CancelButton_Click(object sender, RoutedEventArgs e)
    {
        this.DialogResult = false;
    }

    private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {

    }

    private void textboxqtdhoras_TextChanged(object sender, TextChangedEventArgs e)
    {

    }
}

}

4

2 回答 2

0

今天晚上,我正在为我的书编写关于“事件聚合器”模式的章节,并从收集我对这个主题的想法开始。如果您觉得必须对本章发表评论并给我免费建议,那么我想您应该这样做(请)。我在这里和这里之前写过关于模式的文章。我还引用了一些我还没有写太多的其他模式。Ward Bell 和 John Papa 都写过关于这些模式的博客。明天晚上我将在博客上介绍我的 StoryTeller 实现。

如果您不熟悉该模式,Event Aggregator 对象将:

将来自多个对象的事件引导到单个对象中,以简化客户端的注册。

本质上,它是 GoF Mediator 模式的一种特殊形式。它是应用程序中的一个“集线器”对象,您可以使用它在应用程序的不同部分之间进行解耦的“发布/订阅”消息传递。我已经在 WinForms 应用程序中使用了该模式,在 StoryTeller 中使用了 WPF,甚至在网页中使用了 JavaScript(当我们为工作中的 Web 应用程序实现仪表板模式时,这将非常重要)。

这是我对模式的脑筋急转弯:

登记。必须有人负责向事件聚合器中心注册侦听器。您可以让听众自己通过依赖事件聚合器来进行注册,就像 Prism 惯用的那样。这很棒,因为在查看一个类时它是否被注册为侦听器很明显。我不喜欢这种方法,因为我认为它很笨拙,并且会向每个侦听器添加重复代码——而且重复代码应该在它出现的任何地方被删除。您可以使用另一个对象,例如“Screen Activator”(稍后会详细介绍此模式)来将 ViewModel/Presenter、屏幕或非 UI 元素注册为侦听器。这样做的好处是消除了从执行实际工作的类(ViewModel/Presenter/service)中引导的责任。这实际上只是 2a,但您可以使用自定义“注册表”类在一个地方进行显式订阅者订阅。我喜欢使用带有 IoC 工具的常规注册来根据需要自动将对象添加到事件聚合器。我在 StoryTeller 中使用标记界面和 StructureMap “拦截器”来执行此操作。这是机械上“最简单的”,但增加了一些开销来理解这些部分是如何连接的。但是,还有一个很大的问题,约定是黑魔法而不是显式代码。这是机械上“最简单的”,但增加了一些开销来理解这些部分是如何连接的。但是,还有一个很大的问题,约定是黑魔法而不是显式代码。这是机械上“最简单的”,但增加了一些开销来理解这些部分是如何连接的。但是,还有一个很大的问题,约定是黑魔法而不是显式代码。
可发现性/可追溯性。事件聚合器是一种间接形式,间接几乎总是使系统更难理解。在某些时候,您肯定需要了解哪些对象正在发布以及哪些正在接收事件。强类型事件在这里是一个福音,因为使用高级 IDE 功能(如 R# 的“查找用法”)来快速确定特定类型事件的发布者和订阅者相对容易。CAB 中的事件聚合器模拟依赖于字符串键,使故障排除更加困难。JavaScript 和其他动态语言中的事件聚合器实现也会有同样的问题。诊断。对于我们这些使用静态类型语言的人来说,您可能想要添加一个可以按需生成的诊断报告,该报告可以扫描代码库并根据对事件聚合器的依赖来识别发布者和订阅者。对消息类使用标记接口或通用超类型可以使诊断更加容易。事件过滤。简而言之,并不是每个订阅者都关心某类事件的每个实例。例如,StoryTeller 有几个小部件需要响应每个单独的测试事件(排队、执行、完成),但各个测试屏幕只响应涉及其特定测试的事件。在这种情况下,您需要担心事件是如何过滤的。过滤的责任可以在: 侦听器本身。监听器知道它关心什么,所以让它决定是否继续处理事件。在 EventAggregator 本身内过滤。您可以使用这样的主题注册侦听器:EventAggregator.Register(this, myTest),但这假设有一个“了解”主题的专用事件聚合器。另一种方法是使用 Predicate 或 Func 进行注册以在事件聚合器中进行过滤。我仍在 StoryTeller 内部尝试使用这种模式。我正在考虑让 IoC 拦截器或屏幕激活器进行过滤事件注册。同样,重点是将设置屏幕的繁重工作从 ViewModel/Presenter 中移出,以保持 ViewModel/Presenter 相对干净的线程编组。让事件聚合器负责将屏幕上的回调编组回 UI 线程是非常方便的。Prism 事件聚合器让您可以细粒度地控制是否应该进行编组。当每一点性能都很重要时,最大控制可能会很好,但话又说回来,它会让你在难以测试的部分代码中容易出错。排队。在这一点上,我让 StoryTeller EventAggregator 同步处理事情,但是在后台线程上运行事件发布或排队事件可能是必要的以节省资源。开/关主体。使用事件聚合器可以更轻松地向系统添加新功能,而无需修改现有代码,如果您依赖于没有事件聚合器的直接通信,您将不得不这样做。对于进行增量交付的团队或多个团队在同一系统上并行工作的情况,这是一个重要问题。垃圾收集:您的事件聚合器必须保留对所有订阅者的引用。当屏幕关闭时,这可能会给您带来一些严重的内存泄漏问题,但如果事件聚合器保持引用,则不会收集垃圾。您可以通过在事件聚合器内部使用 Wea​​kReferences 来解决这个问题。另一种选择是显式取消注册侦听器。WeakReference 策略可能更可靠,但也有其自身的问题。如果您使用“Screen Conductor”来管理屏幕激活生命周期,那么显式取消注册并不是那么糟糕。稍后会详细介绍……事件锁存。这里有两个问题:有时忽略事件可能很有价值。我正在特别考虑选项卡上未激活/未显示的屏幕的情况。假设此屏幕接收到有关金融市场数据正在更新的事件。更新隐藏屏幕显示的行为在资源方面被证明是非常昂贵的。当屏幕被停用和隐藏时,您可能希望悄悄地忽略或“锁定”事件。这当然会增加一些复杂性,以使隐藏屏幕“知道”在再次激活时进行自我更新。我认为这就是“屏幕激活器”和“屏幕导体”模式发挥作用的地方。如果在用户激活选项卡时发生标准工作流,那么“屏幕激活器”应该得到一个 Activate() 调用。在某些特殊情况下,您可能希望事件聚合器在响应事件时“锁定”自身。当响应事件的小部件发布其他事件时,这一点尤其重要。考虑在将屏幕绑定到新数据的过程中发布的“更改”事件。在这种情况下,事件聚合器应该忽略新事件,直到第一个事件完全完成。事件排序。按照事件到达事件聚合器的顺序完全处理事件可能很重要。例如,Chad & I 去年遇到了一个问题,订阅者接收到一个事件,然后发布在原始事件到达所有订阅者之前处理的其他事件。某处可能有代码味道,但事件排序可能是您需要考虑的事情。一种尺寸并不适合所有人:在一个应用程序中拥有多个事件聚合器通常是有利的。当单个屏幕本身非常复杂时,我经常发现使用在单个复杂“复合视图”中范围内的事件聚合器很有用。仪器仪表。EventAggregator 实际上是一个消息总线,并具有与消息总线相同的所有优点。通过事件聚合器发送所有事件为您提供了一个很好的集中放置检测代码的地方。更少的重复代码 == 更少的错误和更高的生产力。

Prism EventAggregator 怎么样?

许多人首先通过 Prism 中的实现接触到 Event Aggregator 模式。对于我的普通读者,您可能会感到震惊(我说震惊!)知道我并不特别关心他们在 Prism 中实现该模式的方式。我认为 Prism 的实现笨拙且难以使用。我鄙视首先获取事件聚合器,然后检索“事件”对象,然后我会收听的习惯用法。出版也是一样。我认为我有两个步骤(获取事件,然后发布)而不是仅仅说“IEventAggregator.Send()”,这很尴尬。所有这些都是不必要的噪音代码,“获取事件,然后监听/发布”为我编写的每个涉及监听或发送事件的单元测试增加了一点开销(更多模拟对象设置,这将比额外的生产代码加起来更多)。不,这不是什么大不了的事,但是噪音代码加起来了,由于基础设施,我可以删除的每一点仪式/噪音代码都会让我更有效率,并且代码更容易阅读,更容易处理。

我只想去:

IEventAggregator.Send(消息)。没有其他的。侦听器应该很少或最好有与事件聚合器的 NO/ZILCH/NADA 耦合。我认为 Prism 比 CAB 好得多,但它仍然面临着一些与 CAB 相同的问题。Prism 中 EventAggregator 的复杂性和笨拙直接是由于试图使 EventAggregator 泛化到您能想到的所有可能场景而直接造成的。您将能够为您的应用程序创建一个更好的 EventAggregator 实现,只需为您需要的东西定制一些更简单的东西。至少,您至少可以在 Prism 的通用 API 周围放置一个特定于应用程序的包装器,以使它们更易于使用。

不要将此视为对 Prism 本身的具体批评,因为真正的问题是通用应用程序框架是一种自动妥协。Prism 比 CAB 更好的一个最重要的原因是您可以轻松地(我的意思是)轻松推出自己的事件聚合器并替换 Prism 中的事件聚合器,同时仍然使用 Prism 的其余部分。万岁“组合胜过继承”。你不能用 CAB 做到这一点。

维基:

上帝保佑,河水不会涨,我将在周末结束之前为 Presentation Patterns 书创建一个公共 Wiki。根据多人的建议,我将在公共 Wiki 上编写大部分初稿。我会在它存在时立即宣布它。

于 2013-05-29T10:02:45.387 回答
0

如果我了解您要做什么...您可以使用诸如事件聚合器之类的调解器模式将事件(数据选择)从子窗口传递到父窗口。这是一个涵盖 Event Aggregator 的 StackOverflow 问题

于 2013-05-28T18:07:13.450 回答