我有相当简单的(我希望:))问题: 在MVVM中,View通常监听ViewModel属性的变化。 不过,我有时候喜欢听事件,例如,View可以在VM信号时开始animation,或者closures窗口。 通过使用NotifyPropertyChanged的bool属性来做到这一点(只有当它从false更改为true时才开始animation)是可能的,但感觉像是一个黑客攻击,我更喜欢暴露事件,因为它在语义上是正确的。 此外,我想这样做没有代码在代码隐藏,因为做viewModel.myEvent += handler将意味着我会手动取消注册该事件,以便允许查看GC'D – WPF视图已经能听'属性'弱',我更喜欢编程只声明在视图。 标准的强大的事件订阅也是不好的,因为我需要切换多个视图模型为一个视图(因为每次创build视图需要太多的CPU时间)。 谢谢你的想法(如果有一个标准的解决scheme,一个链接到MSDN就足够了)!
有人知道如何解除绑定事件处理程序,但记住它们以便以后再绑定它们吗? 有什么build议么?
我有一个简单的应用程序,反转任何文本input到另一个文本框中。 问题是,你可以修改任何一个文本框,这些改变将会被(反过来)反映在另一个文本框中。 我写这个代码,相信会导致问题。 private void realText_TextChanged(object sender, EventArgs e) { mirrorText.Text = mirror(realText.Text); } private void mirrorText_TextChanged(object sender, EventArgs e) { realText.Text = mirror(mirrorText.Text); } private string mirror(string text) { return new string(text.Reverse().ToArray()).Replace("\n\r", "\r\n"); } 然后我试了一下,认为它会导致无限循环( realText更改mirrorText ,另一个事件发生, mirrorText更改realText等)。 然而,除了预期的行为发生之外, 我当然很高兴,我可以把它留在这里。 或者我可以吗? 我很确定TextChanged事件应该被触发,每当Text被改变。 这是事件中一些错误保护的预期行为,还是我只是幸运? 这个代码可能在其他计算机上运行不正常,还有其他的编译设置等? 它可以很容易地修复: private void realText_TextChanged(object sender, EventArgs e) { if (realText.Focused) […]
我正在使用一个在C#中转发事件的类。 我想知道是否有这样做的方式,需要较less的代码开销。 这是我迄今为止的一个例子。 class A { public event EventType EventA; } class B { A m_A = new A(); public event EventType EventB; public B() { m_A.EventA += OnEventA; } public void OnEventA() { if( EventB ) { EventB(); } } } A级提出了原始事件。 B类转发它作为EventB(本质上是相同的事件)。 A类对其他模块是隐藏的,所以他们不能直接订阅EventA。 我想要做的是减less类B中用于转发事件的代码开销,因为通常在类B中没有实际处理事件。另外,我将有几个不同的事件,因此需要编写大量的OnEvent ()方法只能用于转发事件。 是否有可能以某种方式自动链接EventA到EventB,所以我有这样的事情: class B { A m_A = new […]
我已经看了四周,并找不到解决scheme:我有一个表单上传文件,它应该在文件select后触发提交。 在FF / Chrome上,它会变得很糟糕,并在文件select后提交表单,但我不能这样做,即。 已经尝试点击/ propertychange,但没有任何反应。 我已经尝试了一些代码: $("#attach").attr("onChange", "alert('I changed')"); $("#attach").live($.browser.msie? 'propertychange': 'change', function(e) { … }); 我尝试的任何要求? 编辑1:我觉得有一个重要的信息,这个input文件,是dynamic创build的,因为它使用.live()来绑定事件
假设我想为我的class级做一个自己的事件监听器,那我该怎么做? 我是否需要手动维护一个线程?
微软向.NET Framework 4引入了BCL的IObservable<T>接口 ,我想,“好极了,我必须使用它!” 所以我深入挖掘并阅读文章和文档,甚至实施了这个模式。 这样做后,我意识到,基本的实现实际上发送所有的T事件到所有的用户没有任何过滤, 即普通广播。 我在某处读到Observable模式是为了普通广播。 我觉得这不是真的,我错过了一些东西。 我的问题: 如果我添加一个过滤机制,使用Observable模式和使用纯CLR事件有什么区别? 什么时候应该使用这种模式,什么时候应该select使用简单的CLR事件? Observable模式的主要优点是什么?
在提出这个问题之后 ,我想知道是否有可能等待一个事件被解雇,然后得到事件数据并返回它的一部分。 有点像这样: private event MyEventHandler event; public string ReadLine(){ return event.waitForValue().Message; } … event("My String"); …elsewhere… var resp = ReadLine(); 请确保你提供的任何解决scheme直接返回值,而不是从别的东西得到它。 我在问上面的方法是否以某种方式可用。 我知道Auto / ManuelResetEvent,但我不知道他们像上面那样直接返回值。 更新:我使用MyEventHandler (其中包含Message字段)声明了一个事件。 我有一个方法在另一个线程中调用ReadLine等待事件触发。 事件触发时,WaitForValue方法(事件处理场景的一部分)返回包含消息的事件参数。 ReadLine将该消息返回给所有调用它的消息。 我问的那个问题的 答案就是我所做的,但是感觉不太对。 它几乎感觉到ManuelResetEvent触发和程序检索数据并返回它之间的数据可能会发生。 更新: Auto/ManualResetEvent的主要问题是它太脆弱了。 一个线程可以等待这个事件,然后没有足够的时间让其他人获得它,然后再把它改成别的东西。 有没有办法使用锁或其他东西? 也许使用get和set语句。
我有一个有趣的情况 – 我有一个表格行,当我点击“展开”button时,显示它是隐藏的对应表格。 包含展开button的原始(未隐藏)行也在某个单元格中具有某些内容,点击后该单元格可以编辑。 我想摆脱扩大button,并通过双击行本身的任何地方,包括单击它时可以编辑的字段,启用行的扩展。 你已经可以闻到麻烦了。 当我双击一行时,在发生dblclick之前,首先触发两个点击事件。 这意味着如果我双击该字段,它将变成一个可编辑的,并且该行将展开。 我想阻止这一点。 我想要doubleclick来防止单击发射,并单击执行照常。 使用event.stopPropagation()显然是行不通的,因为它们是两个不同的事件。 有任何想法吗? 编辑(一些半伪代码): 原始版本: <table> <tbody> <tr> <td><a href="javascript:$('#row_to_expand').toggle();" title="Expand the hidden row">Expand Row</a></td> <td>Some kind of random data</td> <td><?= $editable_cell_which_turns_into_an_input_field_on_single_click[0]->value("First editable value") ?></td> <td><?= $editable_cell_which_turns_into_an_input_field_on_single_click[1]->value("Second editable value") ?></td> <td><?= $editable_cell_which_turns_into_an_input_field_on_single_click[2]->value("Third editable value") ?></td> <!– … –> <td><?= $editable_cell_which_turns_into_an_input_field_on_single_click[n]->value("Nth editable value") ?></td> </tr> <tr style="display: […]
我想用JavaScript创build一个自定义事件。 我有一个带有WebBrowser的WPF应用程序和一个带有JavaScript的HTML页面。 我使用打印机。 当打印机的状态改变时,它会在.NET中触发一个事件。 然后,我使用WebBrowser控件的InvokeScript函数调用JavaScript方法OnPrinterStateChanged(state) 。 问题是我必须在我的网页中实现方法OnPrinterStateChanged(state) 。 我不能更改方法的名称或订阅/取消订阅事件… 我想在一个单独的JavaScript文件中移动JavaScript方法OnPrinterStateChanged(state) 。 我想要的是 : 订阅/取消订阅我的HTML页面中的事件,并决定事件触发时我想要做什么(例如:“ChangeState”) 当.NET事件被触发时,它会调用我单独的.js文件的OnPrinterStateChanged(state) ,然后触发JavaScript事件并调用OnPrinterStateChanged(state)函数。 我find了一些解决scheme,但我没有设法使其工作…什么是最简单的方法来做到这一点?