设计模式: “#委托事件”
数据绑定的构成;
- 绑定源
- 绑定目标
- 绑定对象
绑定源
用于绑定的数据源,可以是任意类的实例,绑定源是数据的提供者或发送者。它可以是一个变量、属性、字段、方法或其他对象。绑定源负责维护数据的状态,并在数据发生更改时通知绑定目标。在Unity中,绑定源可以是游戏对象的组件或脚本中的变量。
``用来绑定的基类;
/// <summary>
/// 实现INotifyPropertyChanged接口来协助数据源进行绑定;
/// </summary>
public abstract class BindableBase : INotifyPropertyChanged
{
/// <summary>
/// 用于数据绑定的事件;
/// </summary>
public event PropertyChangedEventHandler? PropertyChanged;
/// <summary>
/// 检查属性值是否发生改变,如果改变立刻通知事件的订阅者;
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="storage">当前属性值</param>
/// <param name="value">更改的值</param>
/// <param name="propertyName">更改的属性名,使用了CallerMemberName可以自动通知订阅者更改的属性名</param>
/// <returns></returns>
protected bool SetProperty<T>(ref T storage, T value, [CallerMemberName] String propertyName = null!)
{
if (object.Equals(storage, value)) return false;
storage = value;
OnPropertyChanged(propertyName);
return true;
}
/// <summary>
/// 触发事件告知订阅者;
/// </summary>
/// <param name="propertyName"></param>
protected void OnPropertyChanged([CallerMemberName] string propertyName = null!)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
绑定目标
绑定目标是数据的接收者或接收方。它可以是一个变量、属性、字段、方法或其他对象。绑定目标用于接收绑定源发送的数据,并在数据更新时进行相应的处理。在Unity中,绑定目标可以是UI元素(如文本框、滑块等)的属性或其他游戏对象的组件。
绑定对象
绑定对象是连接绑定源和绑定目标的中间件。它负责建立和管理绑定源和绑定目标之间的关联关系,并确保数据的变化能够在它们之间传递。在Unity中,可以使用Unity的UI系统、Unity的事件系统或自定义脚本来实现绑定对象。
单向绑定和双向绑定
单项绑定
单向绑定是指数据的传递和同步只在一个方向上进行,从绑定源到绑定目标。在单向绑定中,当绑定源的数值发生变化时,这些变化会自动传递给绑定目标,使其保持与绑定源同步。然而,当绑定目标的数值发生变化时,这些变化不会反向传递给绑定源。
适用情况:
- 当只需要将数据从一个对象传递到另一个对象时,而不需要在绑定目标上修改数据并将更改传递回绑定源时,可以使用单向绑定。
- 单向绑定适用于只需将数据从一个对象显示到另一个对象或执行一些只读操作的情况。
``示例:
using UnityEngine;
using UnityEngine.UI;
public class DataBindingExample : MonoBehaviour
{
public Text nameLabel;
public Slider healthSlider;
private string playerName = "Player";
private float playerHealth = 100f;
private void Start()
{
// 将nameLabel的文本与playerName变量进行绑定
nameLabel.text = playerName;
// 将healthSlider的值与playerHealth变量进行绑定
healthSlider.value = playerHealth;
}
public void UpdatePlayerName(string newName)
{
// 当输入框文本发生变化时,更新playerName变量并同步到nameLabel
playerName = newName;
nameLabel.text = playerName;
}
public void UpdatePlayerHealth(float newHealth)
{
// 当滑块值发生变化时,更新playerHealth变量并同步到healthSlider
playerHealth = newHealth;
healthSlider.value = playerHealth;
}
}
双向绑定
双向绑定是指数据的传递和同步在两个方向上进行,既可以从绑定源到绑定目标,也可以从绑定目标到绑定源。在双向绑定中,当绑定源的数值发生变化时,这些变化会自动传递给绑定目标,同时当绑定目标的数值发生变化时,这些变化也会反向传递给绑定源。
适用情况:
- 当需要在绑定源和绑定目标之间实现双向数据传递和同步时,例如在表单中输入数据并自动更新数据模型,可以使用双向绑定。
- 双向绑定适用于需要在绑定源和绑定目标之间进行交互和动态更新的情况。
``示例:
using UnityEngine;
using UnityEngine.UI;
public class TwoWayBindingExample : MonoBehaviour
{
public InputField nameInput;
public Text nameLabel;
private string playerName = "Player";
private void Start()
{
// 将nameInput的onValueChanged事件与UpdatePlayerName方法进行绑定
nameInput.onValueChanged.AddListener(UpdatePlayerName);
// 将playerName与nameLabel进行双向绑定
UpdateNameLabel();
}
private void UpdatePlayerName(string newName)
{
// 当输入框文本发生变化时,更新playerName变量并同步到nameLabel
playerName = newName;
UpdateNameLabel();
}
private void UpdateNameLabel()
{
// 将playerName的值更新到nameLabel
nameLabel.text = playerName;
}
}
总结
单向绑定适用于只需将数据从一个对象传递到另一个对象的情况,而双向绑定适用于需要在绑定源和绑定目标之间实现双向数据传递和同步的情况。选择使用哪种绑定方式取决于您的具体需求和场景。有时候,单向绑定足够满足需求并且更简单,而在其他情况下,双向绑定可以提供更强大的交互性和实时更新的功能。