Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
505 views
in Technique[技术] by (71.8m points)

windows - C++/WinRT UWP: Creating custom DataTemplateSelector

My goal is to have an ItemsRepeater able to display two different custom data types. According to the docs, I need to create a DataTemplateSelector. The provided example is however in C# so I had to rewrite it to C++/WinRT on my own. And that's it:

// MyTemplateSelector.idl

namespace MyApp
{  
   [bindable]
   [default_interface]
   runtimeclass MyTemplateSelector : Windows.UI.Xaml.Controls.DataTemplateSelector
   {
      MyTemplateSelector();

      Windows.UI.Xaml.DataTemplate FirstTemplate; 
      Windows.UI.Xaml.DataTemplate SecondTemplate;
   }
}

// MyTemplateSelector.h

#pragma once
#include "MyTemplateSelector.g.h"

namespace winrt::MyApp::implementation
{
   struct MyTemplateSelector : MyTemplateSelectorT<MyTemplateSelector>
   {
      MyTemplateSelector() = default;

      Windows::UI::Xaml::DataTemplate SelectTemplateCore(IInspectable const&, Windows::UI::Xaml::DependencyObject const&);

      Windows::UI::Xaml::DataTemplate FirstTemplate();
      void FirstTemplate(Windows::UI::Xaml::DataTemplate const&);

      Windows::UI::Xaml::DataTemplate SecondTemplate();
      void SecondTemplate(Windows::UI::Xaml::DataTemplate const&);

      private:
      Windows::UI::Xaml::DataTemplate m_firstTemplate{ nullptr };
      Windows::UI::Xaml::DataTemplate m_secondTemplate{ nullptr };
   };
}

namespace winrt::MyApp::factory_implementation
{
   struct MyTemplateSelector : MyTemplateSelectorT<MyTemplateSelector, implementation::MyTemplateSelector>
   {
   };
}

// MyTemplateSelector.cpp

#include "pch.h"
#include "MyTemplateSelector.h"
#include "MyTemplateSelector.g.cpp"

using namespace winrt;
using namespace Windows::UI::Xaml;

namespace winrt::MyApp::implementation
{
   DataTemplate MyTemplateSelector::SelectTemplateCore(IInspectable const& item, DependencyObject const& container)
   {
      return m_firstTemplate;

      // TODO: Some logic to choose between FirstTemplate & SecondTemplate.
   }

   // FirstTemplate property:

   DataTemplate MyTemplateSelector::FirstTemplate()
   {
      return m_firstTemplate;
   }

   void MyTemplateSelector::FirstTemplate(DataTemplate const& value)
   {
      m_firstTemplate = value;
   }

   // SecondTemplate property:

   DataTemplate MyTemplateSelector::SecondTemplate()
   {
      return m_secondTemplate;
   }

   void MyTemplateSelector::SecondTemplate(DataTemplate const& value)
   {
      m_secondTemplate = value;
   }
}

Finally, trying to build this code, I got showered with tons of meaningless errors.

screenshot

While this one seems to be the most important: screenshot2

Output log: https://pastebin.com/7jca0KZZ

I don't really understand what's wrong. I've already tried both possibilities:

DataTemplate SelectTemplateCore(IInspectable const& item); // 1
DataTemplate SelectTemplateCore(IInspectable const& item, DependencyObject const& container); // 2

Well, I'm still relatively new to C++/WinRT, coming there from C#, where things are much simpler and intuitive. Hope someone will be able to solve this issue.

Edit: Apparently, providing an implementation for both overloads SelectTemplateCore(Object) and SelectTemplateCore(Object, DependencyObject) at once, makes it compile correctly.

Edit 2:

  • added output log

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)
等待大神答复

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...