Search Unity

binding property not update to the new value.

Discussion in 'UI Toolkit' started by wang37921, Mar 28, 2020.

  1. wang37921

    wang37921

    Joined:
    Aug 1, 2014
    Posts:
    102
    i combine image and objectfield into a new control: preview the selected sprite.
    seems like right, but choice sprite through objectField, the binding property not update to the new value.

    Code (CSharp):
    1. public class SpritePreviewSelector : BindableElement, INotifyValueChanged<Object>
    2.     {
    3.         public new class UxmlFactory : UxmlFactory<SpritePreviewSelector, UxmlTraits> { }
    4.         public new class UxmlTraits : BindableElement.UxmlTraits { }
    5.         ObjectField objectField;
    6.         Image imagePreview;
    7.         public SpritePreviewSelector()
    8.         {
    9.             objectField = new ObjectField() { objectType = typeof(Sprite) };
    10.             hierarchy.Add(objectField);
    11.             imagePreview = new Image()
    12.             {
    13.                 style = {
    14.                     flexGrow = 1,
    15.                     minWidth = 100,
    16.                     minHeight = 100,
    17.                     borderLeftColor = Color.gray,
    18.                     borderRightColor = Color.gray,
    19.                     borderTopColor = Color.gray,
    20.                     borderBottomColor = Color.gray,
    21.                     borderLeftWidth = 1.0f,
    22.                     borderRightWidth = 1.0f,
    23.                     borderTopWidth = 1.0f,
    24.                     borderBottomWidth = 1.0f,
    25.                     marginLeft = 3.0f,
    26.                     marginRight = 2.0f,
    27.                 }
    28.             };
    29.             hierarchy.Add(imagePreview);
    30.             objectField.RegisterValueChangedCallback(e =>
    31.             {
    32.                 if (e.newValue is Sprite newSprite && newSprite != sprite)
    33.                     value = newSprite;
    34.             });
    35.         }
    36.         Sprite _sprite;
    37.         Sprite sprite {
    38.             get => _sprite;
    39.             set {
    40.                 _sprite = value;
    41.                 imagePreview.image = _sprite.texture;
    42.                 objectField.SetValueWithoutNotify(_sprite);
    43.             }
    44.         }
    45.         public void SetValueWithoutNotify(Object newValue)
    46.         {
    47.             if (newValue == null)
    48.                 sprite = null;
    49.             if (newValue is Sprite newSprite)
    50.                 sprite = newSprite;
    51.         }
    52.         public Object value {
    53.             get => sprite;
    54.             set
    55.             {
    56.                 if (value is Sprite newSprite && newSprite != sprite)
    57.                 {
    58.                     using (var evt = ChangeEvent<Object>.GetPooled(sprite, newSprite))
    59.                     {
    60.                         SetValueWithoutNotify(value);
    61.                         SendEvent(evt);
    62.                     }
    63.                 }
    64.             }
    65.         }
    66.     }
     
    Last edited: Mar 29, 2020
  2. wang37921

    wang37921

    Joined:
    Aug 1, 2014
    Posts:
    102
    set the event target...
    bad document! but good have UnityReferenceSource!
    Code (CSharp):
    1.  
    2.         Object INotifyValueChanged<Object>.value {
    3.             get => sprite;
    4.             set
    5.             {
    6.                 if (value is Sprite newSprite && newSprite != sprite)
    7.                 {
    8.                     using (var evt = ChangeEvent<Object>.GetPooled(sprite, newSprite))
    9.                     {
    10.                         evt.target = this;
    11.                         ((INotifyValueChanged<Object>)this).SetValueWithoutNotify(value);
    12.                         SendEvent(evt);
    13.                     }
    14.                 }
    15.             }
    16.         }
     
    pegorari likes this.