从DataTemplateSelector中检索视图信息

时间:2013-07-30 13:06:21

标签: c# wpf mvvm

对于你们许多人来说,这可能是一个微不足道的问题......

我的应用的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");
  }
}

现在,当创建新Tab时,将调用以下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,在这里我需要&#34;通知&#34;它必须加载的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>

有办法吗?


修改

基本上我要做的就是让我的Tab类访问TemplateSelector。


此致 丹尼尔。

1 个答案:

答案 0 :(得分: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

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