Tag: events

EventAggregator仅适用于MVVM中的ViewModels吗?

我读到有关在MVVM设计中实现的Event Aggregator模式可以帮助解耦ViewModel之间的通信。 我认为Event Aggregator真的是个好主意。 但是,第二个想法是,Event Aggregator仅由ViewModels使用吗? 模型可以发布到事件聚合器中的事件并从中订阅吗? 也许,通过这种方式,ViewModel和Model之间的数据变化可以通过EventAggregator进行关联。 这可能允许一个ViewModel从多个模型中检索信息,而不需要ViewModel来存储对所有模型的引用。 如果我这样做,是否会导致整个架构变得混乱并最终变成反模式? 什么是最佳做法? 编辑: 我想我应该解释一下为什么我这么问。 我看到三个可能的问题: 首先 ,使用DI,我的ViewModel包装了Model。 然后,我的ViewModel可以与我的模型通信。 但是,不是相反。 因此,如果我的模型本身或外部都有一些更改,则需要一种方法来通知其ViewModel。 其次 ,除了ViewModels必须与其他ViewModel进行通信之外,在我看来,模型必须与ViewModel一样多,甚至更多地与其他模型进行通信。 这些导致我认为我可以将所有内容链接到EventAggregator。 第三 ,我发现在某些情况下,单个ViewModel需要从多个模型中提取信息。 但是通过ViewModel构造函数的dependency injection,它只能从一个Model中读取。

WPF应用程序中的事件冒泡

我是WPF的新手。 在我的WPF应用程序中,我有Windows,其中包含用户定义的子控件​​,用户定义的子控件​​再次包含另一个用户定义的子控件​​。 现在从最内层的儿童控制,点击按钮,我想在所有三个控件(即第一个大孩子控制,第二个孩子控制,第三个主控制和窗口)上触发事件。 我知道这可以通过代表和事件冒泡来实现。 你能告诉我怎么样吗?

基本的GUI事件处理问题C#

下午好, 我有一些关于GUI事件处理的基本问题。 首先使用C#,我们如何将事件链接到对象 – 我猜测事件处理程序? 如果是这样,每个处理程序可以使用单独 – 事件处理程序如何定位必须操作的对象? 我对JAVA的工作原理有一个大概的了解。 指向我的参考将是好的 – 我已经搜索谷歌的答案无济于事。 非常感谢,J

WPF中的自定义附加事件

我可能在这里弄错了术语,但我想我正在尝试创建一个附加事件。 在Surface SDK中,您可以执行以下操作: 我想创建一个自定义事件,可以在XAML中以相同的方式添加处理程序,但我遇到了麻烦。 我可以创建一个自定义路由事件,但XAML intellisense没有看到它,如果我只是定期输入它,则不会添加事件处理程序。 这是我的事件定义: public static class TagRectEvents { public static readonly RoutedEvent TagRectEnterEvent = EventManager.RegisterRoutedEvent( “TagRectEnter”, RoutingStrategy.Bubble, typeof( RoutedEventHandler ), typeof( TagRectEvents ) ); public static void AddTagRectEnterHandler( DependencyObject d, RoutedEventHandler handler ) { UIElement element = d as UIElement; if ( element == null ) { return; } element.AddHandler( TagRectEvents.TagRectEnterEvent, […]

Rx如何通过键对一个复杂的对象进行分组,然后在不“停止”流的情况下执行SelectMany?

这与我的其他问题有关。 James World提出了如下解决方案: // idStream is an IObservable of the input stream of IDs // alarmInterval is a Func that gets the interval given the ID var idAlarmStream = idStream .GroupByUntil(key => key, grp => grp.Throttle(alarmInterval(grp.Key))) .SelectMany(grp => grp.IgnoreElements().Concat(Observable.Return(grp.Key))); <编辑2: 问题:如何在不等待第一个事件到达的情况下立即启动计时器? 我猜这是我问题中的根本问题。 为此,我计划发送虚拟对象,其中包含我知道应该存在的ID。 但正如我在下面写的那样,我最终遇到了一些其他问题。 尽管如此,我认为解决这个问题也会很有趣。 然后转发其他有趣的部分! 现在,如果我想将一个复杂的对象分组如下,并按键分组,如下所示(不会编译) var idAlarmStream = idStream .Select(i => new { […]

将事件和委托事件处理程序传递给通用帮助程序方法

我的代码中都有这些。 这是一个WP7 Silverlight应用程序。 UIThreadExecutor.UIThreadExec.Execute(() => buttonControl.Click += new RoutedEventHandler(this.ButtonClickHandler)); 所以,上面的代码,在UI线程上将buttonControl.Click事件分配给事件处理程序ButtonClickHandler ..例如: public void ButtonClickHandler(object sender, System.Windows.RoutedEventArgs e) { } 我想要的是重构: UIThreadExecutor.UIThreadExec.Execute(() => buttonControl.Click += new RoutedEventHandler(this.ButtonClickHandler)); 到一个静态但通用的辅助方法 – 能够指定任何UI控件事件和事件处理程序。 然后该方法将使用UIThreadExecutor类将两者连接在一起。 当然,buttonControl也可以是任何UI控件 – 具有相同类型的不同事件。 例如 – 它可能是带有Checked事件的RadioButton。 如果我在VS 2010中转到RadioButton.Checked或Button.Click的定义它们都是相同的类型: public event RoutedEventHandler Checked; 我一直在摸不着头脑。 我想到了,在我的静态帮助器中 – 声明一个委托(在命名空间级别声明): public delegate void UIControlHandler(object sender, RoutedEventArgs e); 然后我的帮助方法如下所示: public […]

在muticast委托上使用慢速DynamicInvoke的替代方法

我在基类中有以下代码: public static void InvokeExternal(Delegate d, object param, object sender) { if (d != null) { //Check each invocation target foreach (Delegate dDelgate in d.GetInvocationList()) { if (dDelgate.Target != null && dDelgate.Target is System.ComponentModel.ISynchronizeInvoke && ((System.ComponentModel.ISynchronizeInvoke)(dDelgate.Target)).InvokeRequired) { //If target is ISynchronizeInvoke and Invoke is required, invoke via ISynchronizeInvoke ((System.ComponentModel.ISynchronizeInvoke)(dDelgate.Target)).Invoke(dDelgate, new object[] { sender, param }); […]

在C#中获得系统时钟更改刻度

当秒,分钟,小时……在系统时钟中发生变化时,它们是在C#中执行delegate或event的方法,而不使用计时器检查属性是否已更改并且延迟执行事件时每毫秒检查一次最大毫秒。 因此,我想避免在某个时间进行投票和发射事件。

EventHandlers和Covariance

我一直在尝试创建一个通用事件。 基本上它应该是这样的: namespace DelegateTest { class Program { static void Main(string[] args) { var lol = new SomeClass(); lol.SomeEvent += handler; } static void handler(object sender, SomeDerivedClass e) { } } class SomeClass { public delegate void SomeEventDelegate(object sender, T data); public event SomeEventDelegate SomeEvent; } interface ISomeInterface { } class SomeDerivedClass : ISomeInterface { […]

当事件被引发一次时,多次调用c#事件处理程序

下面是我的代码,首先是我提出事件的地方,第二部分是我在另一个类中使用它的地方。 它看起来很简单,但是日志显示即使事件被提升一次,事件也会在消耗此事件的类上触发20次以上。 有任何想法吗? IBSerialPort类: public delegate void PacketReceivedHandler(object sender, PacketReceivedEventArgs e); public event PacketReceivedHandler OnPacketReceived; public class PacketReceivedEventArgs : EventArgs { public Packet PacketReceived { get; private set; } public PacketReceivedEventArgs(Packet packet) { PacketReceived = packet; } } // raise event if (OnPacketReceived != null) { Log(“This is only called ONCE!”); PacketReceivedEventArgs args = new […]