title: C++ WinRT UWP XAML Data binding ItemsSource and SelectedIndex to IObservableVector<hstring> does not work
body: <p>I am using Visual Studio 2019 16.4.3, Microsoft.Windows.CppWinRT 2.0.200117.5, Windows 10 1809 Pro and targeting 10.0.17763.0.</p>
  
  <p>I am trying to port a C++/CX app to C++ WinRT.  I am using data binding of the <code>ItemsSource</code>, <code>SelectedIndex</code>and <code>SelectedItem</code> properties of a combo box but I am running into issues.</p>
  
  <p>For the <code>ItemsSource</code> I am binding to a <code>IObservableVector&lt;String&gt;</code>. The property is implemented using <code>IObservableVector&lt;hstring&gt;</code> and initialized with <code>single_threaded_observable_vector(std::vector&lt;hstring&gt;({L"One", L"Two", L"Three"}))</code></p>
  
  <p>When starting the application I am getting the following exception:</p>
  
  <p>Exception thrown at 0x766B19B2 in BlankCppWinRT.exe: Microsoft C++ exception: winrt::hresult_no_interface at memory location 0x03AED210. occurred</p>
  
  <p>Is this supposed to work? How do I data bind a <code>ItemsSource</code> to a collection of strings? This works in C# and C++/CX. What is the equivalent in C++ WinRT?</p>
  
  <p>When I remove the two way binding to <code>SelectedIndex</code> the application starts and shows the three strings in the combo box, with an empty selected item. But when I try to set the selected index in code by <code>myComboBox().SelectedIndex(0);</code> (in the constructor) I am getting the same exception. Whereas the same line works in the <code>Loaded</code> handler of the page.</p>
  
  <p>Details below.</p>
  
  <p>Any ideas?</p>
  
  <p>Call stack of exception:</p>
  
  <pre><code>    KernelBase.dll!_RaiseException@16() Unknown
      vcruntime140d_app.dll!_CxxThrowException(void * pExceptionObject, const _s__ThrowInfo * pThrowInfo) Line 133    C++
  &gt;   BlankCppWinRT.exe!winrt::throw_hresult(const winrt::hresult result) Line 4623   C++
      BlankCppWinRT.exe!winrt::check_hresult(const winrt::hresult result) Line 4700   C++
      BlankCppWinRT.exe!winrt::impl::as&lt;winrt::Windows::Foundation::IReference&lt;winrt::hstring&gt;,winrt::impl::abi&lt;winrt::Windows::Foundation::IUnknown,void&gt;::type&gt;(winrt::impl::abi&lt;winrt::Windows::Foundation::IUnknown,void&gt;::type * ptr) Line 1941  C++
      BlankCppWinRT.exe!winrt::Windows::Foundation::IUnknown::as&lt;winrt::Windows::Foundation::IReference&lt;winrt::hstring&gt;&gt;() Line 2026  C++
      BlankCppWinRT.exe!winrt::unbox_value&lt;winrt::hstring&gt;(const winrt::Windows::Foundation::IInspectable &amp; value) Line 2872  C++
      BlankCppWinRT.exe!winrt::impl::convertible_observable_vector&lt;winrt::hstring,std::vector&lt;winrt::hstring,std::allocator&lt;winrt::hstring&gt;&gt;&gt;::IndexOf(const winrt::Windows::Foundation::IInspectable &amp; value, unsigned int &amp; index) Line 2547    C++
      BlankCppWinRT.exe!winrt::impl::produce&lt;winrt::impl::convertible_observable_vector&lt;winrt::hstring,std::vector&lt;winrt::hstring,std::allocator&lt;winrt::hstring&gt;&gt;&gt;,winrt::Windows::Foundation::Collections::IVector&lt;winrt::Windows::Foundation::IInspectable&gt;&gt;::IndexOf(void * value, unsigned int * index, bool * winrt_impl_result) Line 566    C++
      Windows.UI.Xaml.dll!DirectUI::ItemCollection::IndexOf(IInspectable * value, unsigned int * index, unsigned char * found) Line 139   C++
      Windows.UI.Xaml.dll!DirectUI::ItemsControl::IsHostForItemContainer(Windows::UI::Xaml::IDependencyObject * pContainer, unsigned char * pIsHost) Line 1939    C++
      Windows.UI.Xaml.dll!DirectUI::ComboBox::IsHostForItemContainer(Windows::UI::Xaml::IDependencyObject * pContainer, unsigned char * pIsHost) Line 1239    C++
      Windows.UI.Xaml.dll!DirectUI::ItemContainerGenerator::ItemFromContainerImpl(Windows::UI::Xaml::IDependencyObject * container, IInspectable * * returnValue) Line 767    C++
      Windows.UI.Xaml.dll!DirectUI::ItemContainerGeneratorGenerated::ItemFromContainer(Windows::UI::Xaml::IDependencyObject * pContainer, IInspectable * * ppReturnValue) Line 222    C++
  
  </code></pre>
  
  <p>This is my XAML code:</p>
  
  <pre class="lang-xml prettyprint-override"><code>&lt;Page
      x:Class="BlankCppWinRT.MainPage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:local="using:BlankCppWinRT"
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
      mc:Ignorable="d" Loaded="OnLoaded"&gt;
  
      &lt;StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center"&gt;
          &lt;Button Margin="8" Width="160" x:Name="myButton" Click="ClickHandler"&gt;Click Me&lt;/Button&gt;
          &lt;ComboBox Margin="8" Width="160" x:Name="myComboBox" ItemsSource="{x:Bind Path=BoxItems}" SelectedIndex="{x:Bind Path=SelectedBoxItemIndex, Mode=TwoWay}"/&gt;
      &lt;/StackPanel&gt;
  &lt;/Page&gt;
  
  </code></pre>
  
  <p>This the .idl file:</p>
  
  <pre><code>namespace BlankCppWinRT
  {
      [bindable]
      [default_interface]
      runtimeclass MainPage : Windows.UI.Xaml.Controls.Page, Windows.UI.Xaml.Data.INotifyPropertyChanged
      {
          MainPage();
          Windows.Foundation.Collections.IObservableVector&lt;String&gt; BoxItems{get;};
          Int32 SelectedBoxItemIndex;
          protected void RaisePropertyChanged(String propertyName);
      }
  }
  </code></pre>
  
  <p>This MainPage.h:</p>
  
  <pre class="lang-cpp prettyprint-override"><code>#pragma once
  
  #include "MainPage.g.h"
  
  namespace winrt::BlankCppWinRT::implementation
  {
      struct MainPage : MainPageT&lt;MainPage&gt;
      {
          MainPage();
  
          Windows::Foundation::Collections::IObservableVector&lt;hstring&gt; BoxItems();
  
          int32_t SelectedBoxItemIndex();
          void SelectedBoxItemIndex(int32_t value);
  
          void ClickHandler(Windows::Foundation::IInspectable const&amp; sender, Windows::UI::Xaml::RoutedEventArgs const&amp; args);
  
          void RaisePropertyChanged(hstring const&amp; propertyName);
          winrt::event_token PropertyChanged(Windows::UI::Xaml::Data::PropertyChangedEventHandler const&amp; handler);
          void PropertyChanged(winrt::event_token const&amp; token) noexcept;
  
          void OnLoaded(winrt::Windows::Foundation::IInspectable const&amp; sender, winrt::Windows::UI::Xaml::RoutedEventArgs const&amp; e);
  
      protected:
          template&lt;typename T&gt;
          bool SetProperty(T&amp; storage, const T&amp; value, const hstring&amp; propertyName)
          {
              if (storage == value)
                  return false;
              storage = value;
              RaisePropertyChanged(propertyName);
              return true;
          }
  
      private:
          event&lt;winrt::Windows::UI::Xaml::Data::PropertyChangedEventHandler&gt; m_propertyChanged;
  
      private:
          Windows::Foundation::Collections::IObservableVector&lt;hstring&gt; m_boxItems;
          int m_selectedBoxItemIndex{};
      };
  }
  
  namespace winrt::BlankCppWinRT::factory_implementation
  {
      struct MainPage : MainPageT&lt;MainPage, implementation::MainPage&gt;
      {
      };
  }
  
  </code></pre>
  
  <p>This is MainPage.cpp:</p>
  
  <pre class="lang-cpp prettyprint-override"><code>#include "pch.h"
  #include "MainPage.h"
  #include "MainPage.g.cpp"
  
  using namespace winrt;
  using namespace Windows::UI::Xaml;
  
  namespace winrt::BlankCppWinRT::implementation
  {
      MainPage::MainPage()
          : m_boxItems{single_threaded_observable_vector(std::vector&lt;hstring&gt;({L"One", L"Two", L"Three"}))}
      {
          InitializeComponent();
          //causes exception
          //myComboBox().SelectedIndex(0);
      }
  
      Windows::Foundation::Collections::IObservableVector&lt;hstring&gt; MainPage::BoxItems()
      {
          return m_boxItems;
      }
  
      int32_t MainPage::SelectedBoxItemIndex()
      {
          return m_selectedBoxItemIndex;
      }
  
      // data binding to SelectedBoxItemIndex causes exception
  
      void MainPage::SelectedBoxItemIndex(int32_t value)
      {
          SetProperty(m_selectedBoxItemIndex, value, L"SelectedBoxItemIndex");
      }
  
      void MainPage::ClickHandler(IInspectable const&amp;, RoutedEventArgs const&amp;)
      {
          myButton().Content(box_value(L"Clicked"));
          SelectedBoxItemIndex(2);
      }
  
      void MainPage::RaisePropertyChanged(hstring const&amp; propertyName)
      {
          m_propertyChanged(*this, PropertyChangedEventArgs(propertyName));
      }
  
      winrt::event_token MainPage::PropertyChanged(Windows::UI::Xaml::Data::PropertyChangedEventHandler const&amp; handler)
      {
          return m_propertyChanged.add(handler);
      }
  
      void MainPage::PropertyChanged(winrt::event_token const&amp; token) noexcept
      {
          m_propertyChanged.remove(token);
      }
  
      void MainPage::OnLoaded(winrt::Windows::Foundation::IInspectable const&amp; sender, winrt::Windows::UI::Xaml::RoutedEventArgs const&amp; e)
      {
          // works
          myComboBox().SelectedIndex(0);
      }
  }
  
  </code></pre>