可绑定Linq有什么好处?

时间:2011-04-13 15:14:57

标签: linq bindable-linq

我是Linq的新手刚开始在正常绑定和sql查询的项目中使用... 比我遇到过Bindable Linq这个词......

有人能告诉我如何使用它以及它有用吗? 在哪里使用??

我在stackoverflow和许多其他网站上遇到过它的例子但是却找不到如何使用它?

如果是,那么我是否必须添加引用以使用可绑定的linq?

由于我是新手,Pleas的家伙帮我解决了这个问题。

3 个答案:

答案 0 :(得分:2)

可绑定LINQ与WPF / Silverlight(或依赖于ObservableCollection<T>的任何内容一起使用时,可以向UI通知集合的更改)非常有用。

Bindable LINQ还尝试检测查询中的UI依赖项并绑定到相应的事件,以便在UI更改时,重新评估查询,而开发人员不必编写任何代码。

Bindable LINQ的CodePlex页面有一个非常好的解释:

Codeplex - Bindable LINQ

答案 1 :(得分:0)

看看http://clinq.codeplex.com/,它看起来比Bindable LINQ更活跃。

答案 2 :(得分:0)

在应用程序中,经常会出现一种情况,即有必要根据源数据计算某些值。让我举一个简单的例子,在现实生活中,一切都可能更加复杂(可绑定的Linq更适用于更复杂的情况)。例如,您需要根据原始价格和订单中每种产品的折扣来计算最终价格。如果订单商品(添加,删除)或折扣发生变化,我们还必须更新最终价格。不使用可绑定的Linq,有两种方法可以实现:

1)每次订购商品(添加,删除)或折扣更改时,调用重新计算总价的方法。

2)调用计时器重新计算总价的方法(每5秒一次) 这些方法都有缺点。

第一种方法具有以下缺点:由于必须在代码中的许多地方调用重新计算总价的方法,因此我们可能忘记在某处调用重新计算总价的方法。 第二种方法具有以下缺点:

1)延迟刷新用户界面中的总价

2)当订单的组成和折扣没有变化时,徒劳地调用重新计算最终价格的方法,这会对性能产生不利影响

这两种方法都有以下缺点:每次重新计算最终价格的方法都会重新进行整个计算(枚举所有订购商品),而不是考虑单个商品的单独更改。这会对性能产生不利影响。 使用可绑定的Linq,我们只需要

1)确定最终价格的计算方式

2)使用INotifyPropertyChangedINotifyCollectionChanged接口。

我想向您介绍实现这种方法的图书馆:ObservableComputations。有了这个库,我们可以这样编写代码:

	public class Order : INotifyPropertyChanged
	{
		public ObservableCollection<OrderItem> Items {get; set;}
      
		private int _discount;
		public int Discount 
		{
			get => _discount;
			set
			{
				_discount = value;
				PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Discount)));
			}
		}
      

      
		private Computing<decimal> _totalPrice;
		public Computing<decimal> TotalPrice =>  _totalPrice = _totalPrice ??
		    Items.Selecting(i => i.Price * i.Quantity).Summarizing()
			    .Using(totalOriginalPrice => 
				     totalOriginalPrice.Value 
                                         - totalOriginalPrice.Value * Discount / 100);

		public event PropertyChangedEventHandler PropertyChanged;
	}

	public class OrderItem  : INotifyPropertyChanged
	{
		private decimal _price;
		public decimal Price 
		{
			get => _price;
			set
			{
				_price = value;
				PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Price)));
			}
		}  
      
		private int _quantity;
		public int Quantity 
		{
			get => _quantity;
			set
			{
				_price = value;
				PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Quantity)));
			}
		}   

		public event PropertyChangedEventHandler PropertyChanged;
	}

我们需要的实际值存储在TotalPrice.Value中。 TotalPrice返回INotifyPropertyChanged的实例,并在Value属性更改时通知您,因此您可以将此属性绑定到WPF Xamarin的控件(我相信Blazor也是如此)。当项目收集或折扣,数量,价格属性更改时,值属性也会更改。

Here,您可以看到其他类似库的讨论。