0

也许这对你们中的许多人来说是一个微不足道的问题......

我的应用程序有一个 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>

在窗口 ViewModel 我有以下道具:

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 中访问我的 Tab 类。


问候,丹尼尔。

4

1 回答 1

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 并在您的资源中定义您的数据模板

<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>
于 2013-07-30T13:55:06.720 回答