包含此页的版本:
不含此页的版本:
您可以创建自定义绑定类型来扩展运行时绑定系统。要创建自定义绑定类型,请创建一个类并从CustomBinding类。
这CustomBinding就像IBinding接口,它允许您注册多个绑定实例而不是单个绑定实例。这CustomBinding是一个可扩展性入口点,并且仅提供Update方法来更新绑定。但是,可以实现以下方法,以便在注册、取消注册绑定以及元素上的数据源上下文发生更改时接收回调:
要定义绑定类型的数据源和数据源路径,请实现IDataSourceProvider接口。绑定系统使用dataSource和dataSourcePath此接口提供的属性,用于确定解析的数据源和数据源路径。这些属性称为“本地”,因为它们会覆盖从层次结构中获取的值。重要的是,修改这些“局部”属性不会影响元素本身或其任何后代。
默认情况下,绑定系统会更新CustomBinding实例。
要定义更新触发器,请使用以下方法:
MarkDirty:将绑定对象设置为dirty以便在下一个周期中更新。updateTrigger:使用此enum属性来更改绑定的更新方式。BindingResult:使用此方法自定义更新过程。这BindingResult是一个结构体,用于告诉您更新是否成功。它包含一个status和message.这BindingResult包含一个status和message.以下是status:
您可以使用Pending结果BindingResult方法通知绑定系统是否需要在下一个周期更新绑定对象。
本小节提供了一个示例,演示如何在UI Builder、UXML和C#中创建自定义绑定类型并设置绑定。
以下示例创建显示当前时间的自定义绑定类型。您可以将其绑定到text属性来创建时钟。
using System;
using Unity.Properties;
using UnityEngine.UIElements;
[UxmlObject]
public partial class CurrentTimeBinding : CustomBinding
{
[UxmlAttribute]
public string timeFormat = "HH:mm:ss";
public CurrentTimeBinding()
{
updateTrigger = BindingUpdateTrigger.EveryUpdate;
}
protected override BindingResult Update(in BindingContext context)
{
var timeNow = DateTime.Now.ToString(timeFormat);
var element = context.targetElement;
if (ConverterGroups.TrySetValueGlobal(ref element, context.bindingId, timeNow, out var errorCode))
return new BindingResult(BindingStatus.Success);
// Error handling
var bindingTypename = TypeUtility.GetTypeDisplayName(typeof(CurrentTimeBinding));
var bindingId = $"{TypeUtility.GetTypeDisplayName(element.GetType())}.{context.bindingId}";
return errorCode switch
{
VisitReturnCode.InvalidPath => new BindingResult(BindingStatus.Failure, $"{bindingTypename}: Binding id `{bindingId}` is either invalid or contains a `null` value."),
VisitReturnCode.InvalidCast => new BindingResult(BindingStatus.Failure, $"{bindingTypename}: Invalid conversion from `string` for binding id `{bindingId}`"),
VisitReturnCode.AccessViolation => new BindingResult(BindingStatus.Failure, $"{bindingTypename}: Trying set value for binding id `{bindingId}`, but it is read-only."),
_ => throw new ArgumentOutOfRangeException()
};
}
}
创建自定义绑定类型时,它会显示在 UI Builder 的“添加绑定”窗口中。若要在 UI Builder 中设置绑定,请在 Add Binding 窗口中,从 Type 列表中选择 CurrentTimeBinding。
此绑定的 UXML 等效项如下:
<ui:Label text="Label">
<Bindings>
<CurrentTimeBinding property="text" />
</Bindings>
</ui:Label>
此绑定的 C# 等效项如下所示:
var label = new Label();
label.SetBinding("text", new CurrentTimeBinding());
请遵循以下提示和最佳实践来优化性能:
BindingUpdateTrigger.OnSourceChanged:如果绑定类型仅在源中检测到更改时才需要更新,请将updateTrigger自BindingUpdateTrigger.OnSourceChanged.这可确保仅在必要时更新绑定类型,从而优化性能。BindingUpdateTrigger.WhenDirty用于手动更新:如果手动更新绑定类型并且不需要立即同步,请将updateTrigger自BindingUpdateTrigger.WhenDirty.这允许您手动控制绑定类型的更新时间,从而提供对同步的灵活性和控制。OnActivated,OnDeactivated或OnDataSourceChanged回调而不是Update回调。这些回调在特定的生命周期事件中触发,减少不必要的更新并提高效率。通过使用适当的回调,您可以优化绑定类型的行为并确保在需要时精确地进行更新。