2013-07-30 116 views
0

也許這是定義爲你們許多瑣碎的問題...檢索DataTemplateSelector查看信息

我的應用程序有一個TabControl:

<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> 

在窗口視圖模型我有以下道具:

private ObservableCollection<Tab> _Tabs; 

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

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

現在,創建一個新的標籤時,以下DataTemplateSelector被稱爲:

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; 
    } 

    } 

的DataTemplate中是基於XmlDataProvider在這裏,我需要「通知」的XML文件,它加載,因爲它是每個標籤不同的模板:

<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> 

有沒有辦法做到這一點?


編輯

基本上我所要做的就是有機會獲得我的標籤類進TemplateSelector。


問候, 丹尼爾。

回答

0

,如果你能這樣定義

public class TabFirst:ITab {} 
public class TabSecond:ITab {} 
public class TabBlup:ITab {} 

視圖模型的標籤

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

你可以擺脫DataTemplateSelector的,只是definfe你的DataTemplates在你的資源

<DataTemplate DataType="{x:Type local:TabFirst}"> 
    <view:TabFirstView /> 
<DataTemplate/> 

<DataTemplate DataType="{x:Type local:TabSecond}"> 
    <view:TabSecondView /> 
<DataTemplate/> 

和你內容控制將只是

<TabControl.ContentTemplate> 
    <DataTemplate> 
     <ContentControl Content="{Binding}" /> 
    </DataTemplate> 
</TabControl.ContentTemplate> 
+0

嗨@blindmeis,也許我不能很好地解釋我要做什麼。我編輯了我的帖子,而且實質上我的問題是有權訪問我的Tab類到TemplateSelector中。 – Barzo