Quantcast
Channel: Windows Presentation Foundation (WPF) forum
Viewing all articles
Browse latest Browse all 18858

How to access to an object inside TemplateSelector

$
0
0

Hi,

maybe this is a trivial question for many of you...
in the following code what I need to do is:

to have access to my Tab class inside the TemplateSelector.

My app has a TabControl defined as:

<TabControl ItemsSource="{Binding Tabs}" SelectedItem="{Binding SelectedTab}"><!--Bind the SelectionChanged event of the tab--><i:Interaction.Triggers><i:EventTrigger EventName="SelectionChanged"><i:InvokeCommandAction Command="{Binding SelectedChangedCommand}" /></i:EventTrigger></i:Interaction.Triggers><!--This is How tab will look--><TabControl.ItemTemplate><DataTemplate><DockPanel><Button Name="BtnCloseTab" 
                        DockPanel.Dock="Right" 
                        Margin="5,0,0,0" 
                        Padding="0"                         
                        Command="{Binding RelativeSource=
                                  {RelativeSource FindAncestor, AncestorType={x:Type TabControl}}, 
                                  Path=DataContext.CloseTabCommand}"><Image Source="/EurocomCPS;component/Images/closeTab.png" Height="11" Width="11"></Image></Button><TextBlock Text="{Binding Header}" /></DockPanel></DataTemplate></TabControl.ItemTemplate><!--This will be the content for the tab control--><TabControl.ContentTemplate><DataTemplate><ContentControl
              ContentTemplateSelector="{StaticResource TemplateSelector}"
              Content="{Binding}" /></DataTemplate></TabControl.ContentTemplate></TabControl>

In the window ViewModel I have the following prop:

    private ObservableCollection<Tab> _Tabs;

    public CPSViewModel()
    {
      _Tabs = new ObservableCollection<Tab>();
    }

    public ObservableCollection<Tab> Tabs
    {
      get { return _Tabs;}
      private set 
      {
        _Tabs = value;
        this.RaisePropertyChanged("Tabs");
      }
    }

Now, when a new Tab is created, the following DataTemplateSelector is called:

  class TemplateSelector : DataTemplateSelector
  {
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
      if (item != null)
      {
        string templateFile = string.Format("Templates/{0}", 
                                            Properties.Settings.Default.AppId + ".tmpl");
        if (File.Exists(templateFile))
        {
          FileStream fs = new FileStream(templateFile, FileMode.Open);
          DataTemplate template = XamlReader.Load(fs) as DataTemplate;
          return template;
        }
      }
      return null;
    }

  }

The DataTemplate is based on the XmlDataProvider and here I need to "inform" the Template which xml file it has to load because it is different for every tab:

<DataTemplate
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"><DataTemplate.Resources><local:StringToBoolConverter x:Key="StringToBoolConverter" /><local:StringToIntConverter x:Key="StringToIntConverter" /><XmlDataProvider x:Key="dataProvider" XPath="func/parametri/param/BLOCKS"/></DataTemplate.Resources><Grid>
    .... controls ....</Grid></DataTemplate>

Is there a way to do it?

Regards,
Daniele.



Viewing all articles
Browse latest Browse all 18858

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>