可綁定的LINQ和連續的LINQ之間的主要區別是什麼?可綁定的LINQ與連續的LINQ
•可綁定LINQ:www.codeplex.com/bindablelinq
•連續LINQ:www.codeplex.com/clinq加入
一個以上的方案基礎上提供了反饋:
• Obtics:obtics.codeplex.com
可綁定的LINQ和連續的LINQ之間的主要區別是什麼?可綁定的LINQ與連續的LINQ
•可綁定LINQ:www.codeplex.com/bindablelinq
•連續LINQ:www.codeplex.com/clinq加入
一個以上的方案基礎上提供了反饋:
• Obtics:obtics.codeplex.com
他們是這兩個軟件包試圖解決的兩個問題:缺少一個CollectionChanged事件和動態結果集。還有一個額外的問題是可綁定解決方案,即額外的自動事件觸發器。
的第一個問題兩個軟件包旨在解決是這樣的:通過LINQ查詢返回
對象做 不能提供CollectionChanged事件。
連續LINQ自動執行此所有查詢,沒有變化:
from item in theSource select item ;
可綁定LINQ這是否當你添加.asBindable到您的查詢源對象:
from item in theSource.AsBindable() select item ;
第二個問題兩個軟件包旨在解決的是:從LINQ查詢 返回
結果集是靜態的。
通常,當你做一個LINQ查詢您的結果集不變,直到你做一個新的查詢。使用這兩個軟件包,只要更新了源,就會更新結果集。 (壞的性能,良好的實時更新)
例
var theSource = new ContinuousCollection<Customer>();
var theResultSet = from item in theSource where item.Age > 25 select item;
//theResultSet.Count would equal 0.
因爲你使用可綁定或連續LINQ,你可以修改theSource和theResultSet會自動包含新項目。
theSource.Add(new Customer("Bob", "Barker" , 35, Gender.Male)); //Age == 35
//theResultSet.Count would now equal 1.
的另一個問題可綁定LINQ提供:(從自己的頁面直接引用)
contactsListBox.ItemsSource = from c in customers
where c.Name.StartsWith(textBox1.Text)
select c;
可綁定LINQ將檢測 查詢依賴的Text屬性 TextBox對象textBox1。由於 TextBox是WPF控件,因此LINQ知道訂閱控件上的 TextChanged事件。
最終結果是,作爲用戶 類型,查詢中的項目是 重新評估,並且更改顯示在 屏幕上。無需額外的代碼 來處理事件。
另一件事要記住,雖然BindableLinq需要在LINQ語句中的 「.AsBindable()」 的號召,CLINQ要求您使用ContinuousCollection < T>代替的ObservableCollection < T>。簡單地看了兩遍之後,我想我將會使用可綁定的LINQ。
確實;連續LINQ的主要問題是無法使用任何實現泛型IEnumerable和INotifyCollectionChanged的集合。可綁定的LINQ在使用實現這兩個接口的自定義集合時沒有問題。
我可以將您的注意力吸引到另一個codeplex項目嗎?它被稱爲Obtics並處理相同的問題(http://obtics.codeplex.com)。
它解決了第一個問題和第二個問題,並將反應性提升到了非常深的層次(使用基於LINQ的光線跟蹤器進行了演示)。
它聲稱完全支持所有LINQ語句的Enumerable類的方法。
它使用另一種機制來創建現場查詢:
var theResultSet = ExpressionObserver.Execute(
() => from item in theSource where item.Age > 25 select item
).Cascade();
使用綁定LINQ,因爲它實現IDisposable,因此,當一個查詢得到處理,你可以控制的。處置它時,INotifyPropertyChanged的所有訂閱都將取消訂閱。
連續的LINQ應該用弱事件來解決這個問題,但它不能工作到我能夠測試的程度。
嗯...這似乎是與可綁定的LINQ問題(第二斷言失敗):
var _source = CreateSource_6People(); //(David, 27), (Mark, 15), (Steve, 30), (Jordan, 43), (Shiva, 30), (Erb, 43)
IBindable<int> bindable = _source.AsBindable().Sum(x => x.Age);
var agesSum = 27+15+30+43+30+43;
Assert.AreEqual(agesSum, bindable.Current); //PASSES
_source[0].Age += 1;
Assert.AreEqual(agesSum + 1, bindable.Current); //FAILS... DISAPPOINTING
不錯!我不知道這樣的事情存在。感謝您將它引入我的注意alex。 :-) – mezoid 2009-03-03 22:53:20
考慮到所有這三個項目後,我決定繼續開發[我自己的解決方案](http://happynomad121.blogspot.com/2013/01/data-binding-among-complex-expressions.html),因爲它允許我寫入純LINQ到對象的查詢,無需修改,就像我以前一直所做的那樣。 – HappyNomad 2013-03-09 04:03:02