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.
While this one seems to be the most important:
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:
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…