我经常使用knockout.js,我喜欢计算可观测性的概念。
计算可观测性定义为其他可观测值的函数的思想,它依赖于其内部使用的任何可观测变量。
这允许非常有趣的场景,在这种情况下,所有的因变量一旦发生影响其他计算变量的单个可观察的更改就会更新一次。
http://knockoutjs.com/documentation/computedObservables.html
问题:C#是否具有使用标准库或开源库的等价功能?
发布于 2017-04-15 07:57:36
回答:是的,有。
接口INotifyPropertyChanged正在这样做,它位于System.ComponentModel命名空间中。
此接口包含一个PropertyChanged事件,该事件将在更改属性时触发。
C# 4及以下示例
public class DataCS4 : INotifyPropertyChanged
{
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
// Represent an Observable
private int firstNumber;
public int FirstNumber
{
get { return firstNumber; }
set
{
if (value == firstNumber)
return;
this.firstNumber = value;
OnPropertyChanged("FirstNumber");
OnPropertyChanged("Sum");
}
}
// Represent an Observable
private int secondNumber;
public int SecondNumber
{
get { return secondNumber; }
set
{
if (value == secondNumber)
return;
this.secondNumber = value;
OnPropertyChanged("SecondNumber");
OnPropertyChanged("Sum");
}
}
// Represent Computed
public int Sum { get { return FirstNumber + SecondNumber; } }
}这是两个整数求和的简单例子。
我们有FirstNumber属性,(我们可以认为它是可以观察到的)。
我们也有SecondNumber属性(我们可以认为它是可以观察到的。)
我们有Sum性质(我们可以认为它是Knockout计算出来的)。
现在,每当我们更改FirstNumber或SecondNumber (通过调用它们对应的set函数)时,我们都会通知所有订阅者这些属性(这是通过调用OnPropertyChanged方法实现的)。
另外,我们正在为OnPropertyChanged属性调用Sum属性,以便通知该属性的订阅者该属性的值已经更改。
注意当使用WPF + MVVM模式时,这是非常常见的模式。
当使用C# 5.0或C# 6.0__时,您可以从它们的新特性中获益,从而使代码变得更容易
C# 5.0示例
public class DataCS5 : INotifyPropertyChanged
{
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName]string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
// Represent an Observable
private int firstNumber;
public int FirstNumber
{
get { return firstNumber; }
set
{
if (value == firstNumber)
return;
this.firstNumber = value;
OnPropertyChanged();
OnPropertyChanged("Sum");
}
}
// Represent an Observable
private int secondNumber;
public int SecondNumber
{
get { return secondNumber; }
set
{
if (value == secondNumber)
return;
this.secondNumber = value;
OnPropertyChanged();
OnPropertyChanged("Sum");
}
}
// Represent Computed
public int Sum { get { return FirstNumber + SecondNumber; } }
}这里有两个变化
OnPropertyChanged();。注意:CallerMemberName属性存在于System.Runtime.CompilerServices命名空间中。
C# 6.0示例
使用C# 6.0可以简化OnPropertyChanged方法的实现。
public class DataCS6 : INotifyPropertyChanged
{
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
// C# 6.0
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
// Represent an Observable
private int firstNumber;
public int FirstNumber
{
get { return firstNumber; }
set
{
if (value == firstNumber)
return;
this.firstNumber = value;
OnPropertyChanged();
OnPropertyChanged("Sum");
}
}
// Represent an Observable
private int secondNumber;
public int SecondNumber
{
get { return secondNumber; }
set
{
if (value == secondNumber)
return;
this.secondNumber = value;
OnPropertyChanged();
OnPropertyChanged("Sum");
}
}
// Represent Computed
public int Sum => FirstNumber + SecondNumber;
}更新
对以下评论的答复:
有意思的!但是在这里,您必须自己管理依赖项。您必须触发一个更改为Sum的属性。在淘汰赛中,它自己计算出哪些属性将触发在计算结果上更改的属性。有什么办法吗?
我想你可以有两个选择(至少)
以下是从努基特下载库后的新代码
PropertyChanged.ImplementPropertyChanged公共类数据{ public int FirstNumber { get;set;} public int SecondNumber { get;set;} public int Sum => SecondNumber + FirstNumber;}
干杯!
https://stackoverflow.com/questions/43414112
复制相似问题