Re: How to use DataTemplateSelector?
Posted: 27 Mar 2015, 21:29
Hi,
I was able to run your sample (a bit more simplified) in the XamlPlayer:
Please let me know if it works for you. Perhaps you can expand this sample until you get the whole sample working.
NOTE: To specify the font family the # sign must be placed between the path and the family name, like this:
I was able to run your sample (a bit more simplified) in the XamlPlayer:
Code: Select all
<Grid
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="TestPanel">
<Grid.Resources>
<DataTemplate x:Key="IconTextDataTemplate_key">
<Grid HorizontalAlignment="Center" Margin="2,0,0,0" VerticalAlignment="Center">
<TextBlock
HorizontalAlignment="Center"
Margin="0"
VerticalAlignment="Center"
Focusable="False"
FontSize="16"
Foreground="Black"
Text="{Binding StatusItemText}"
TextWrapping="NoWrap"/>
</Grid>
</DataTemplate>
<StatusItemTemplateSelector x:Key="statusItemTemplateSelector"
IconTextDataTemplate="{StaticResource IconTextDataTemplate_key}"/>
</Grid.Resources>
<ItemsControl x:Name="System_StatusBarArea"
Width="200" Height="100"
Background="Silver" BorderBrush="Gray" BorderThickness="4"
ItemTemplateSelector="{StaticResource statusItemTemplateSelector}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</Grid> Code: Select all
struct StatusBar_Item : public BaseComponent
{
StatusBar_Item(const NsChar* itemText) : mItemText(itemText) {}
const NsChar* GetStatusItemText() const { return mItemText.c_str(); }
NsString mItemText;
NS_IMPLEMENT_INLINE_REFLECTION(StatusBar_Item, BaseComponent)
{
NsMeta<TypeId>("StatusBar_Item");
NsProp("StatusItemText", &StatusBar_Item::GetStatusItemText);
}
}; Code: Select all
struct StatusItemTemplateSelector : public DataTemplateSelector
{
StatusItemTemplateSelector() {}
~StatusItemTemplateSelector() {}
DataTemplate* SelectTemplate(Core::BaseComponent* item, DependencyObject* container)
{
return _iconTextDataTemplate.GetPtr();
}
DataTemplate* GetIconTextDataTemplate() const
{
return _iconTextDataTemplate.GetPtr();
}
void SetIconTextDataTemplate(DataTemplate* pTemplate)
{
_iconTextDataTemplate.Reset(pTemplate);
}
Ptr<DataTemplate> _iconTextDataTemplate;
NS_IMPLEMENT_INLINE_REFLECTION(StatusItemTemplateSelector, DataTemplateSelector)
{
NsMeta<TypeId>("StatusItemTemplateSelector");
NsProp("IconTextDataTemplate",
&StatusItemTemplateSelector::GetIconTextDataTemplate,
&StatusItemTemplateSelector::SetIconTextDataTemplate);
}
}; Code: Select all
struct TestPanel : Grid
{
TestPanel() {}
~TestPanel() {}
void OnPostInit()
{
ItemsControl* ic = FindName<ItemsControl>("System_StatusBarArea");
Ptr<Collection> items = *new Collection();
Ptr<StatusBar_Item> item;
item = *new StatusBar_Item("Left");
items->Add(item.GetPtr());
item = *new StatusBar_Item("Center");
items->Add(item.GetPtr());
item = *new StatusBar_Item("Right");
items->Add(item.GetPtr());
ic->SetItemsSource(items.GetPtr());
}
NS_IMPLEMENT_INLINE_REFLECTION(TestPanel, Grid)
{
NsMeta<TypeId>("TestPanel");
}
}; NOTE: To specify the font family the # sign must be placed between the path and the family name, like this:
Code: Select all
FontFamily="Fonts/#Arial"