Page 1 of 1

Indexer property for data binding with C++ API

Posted: 11 Jan 2019, 04:29
by nikobarli
Hi,

Just want to make sure. Is the indexer property is supported with C++ API ?

From https://www.noesisengine.com/docs/Gui.C ... orial.html, it seems that it is only supported in C#.

Re: Indexer property for data binding with C++ API

Posted: 11 Jan 2019, 05:47
by nikobarli
Arrggh, I post to a wrong forum !
Sorry, please delete this entry.

Re: Indexer property for data binding with C++ API

Posted: 11 Jan 2019, 13:02
by sfernandez
In C++ your view model hast to implement the IListIndexer or IDictionaryIndexer interface.
class IndexerTest: public BaseComponent, public IListIndexer
{
public:
  int _array[3];

  // IListIndexer
  bool TryGet(uint32_t index, Ptr<BaseComponent>& item) const override
  {
    if (index < 3)
    {
      item = Boxing::Box<int>(_array[index]);
      return true;
    }
    return false;
  }
  virtual bool TrySet(uint32_t index, BaseComponent* item) override
  {
    if (index < 3 && Boxing::CanUnbox<int>(item))
    {
      _array[index] = Boxing::Unbox<int>(item);
      return true;
    }
    return false;
  }
  
  NS_IMPLEMENT_INLINE_REFLECTION(IndexerTest, BaseComponent)
  {
    NsImpl<IListIndexer>();
  }
};
Then you can use the [] in the binding path on your data (in the following sample SomeIndexer property will return an instance of IndexerTest):
<TextBlock Text="{Binding A.B.SomeIndexer[2]}"/>

Re: Indexer property for data binding with C++ API

Posted: 15 Jan 2019, 10:04
by nikobarli
I see.

I have further a question. Is it possible to use enum as an index for binding ?

Something like
<TextBlock Text="{Binding A.B.SomeIndexer[MyEnum.Test]}"/>
Thanks.

Re: Indexer property for data binding with C++ API

Posted: 16 Jan 2019, 17:40
by sfernandez
Unfortunately no, current implementation only expects an integer (IListIndexer) or a string (IDictionaryIndexer). So the 'MyEnum.Test' would be interpreted as a string key into the dictionary indexer.

If you need that feature, could you please report it in our bugtracker?