2013-11-18 7 views
0

У меня есть следующий код, который создает TabControl. Каждая вкладка содержит UserControl (код ниже), который отображает разные данные (один показывает информацию о местном налогообложении, а другую показывает информацию о налогах с Fed/State).Получить имя TabItem в UserControl

TabControl

<TabControl 
     Name="MappingTabs" 
     Margin="6,7,7,8" Padding="6" 
     Background="White" > 
     <TabItem 
      Name="LocalTaxTab" 
      Padding="6,1" 
      Header="Local"> 
      <AdornerDecorator> 
       <DockPanel> 
        <Border Margin="7"> 
         <GroupBox 
          Name="LocalTaxesGroup"> 
          <GroupBox.Header> 
           <TextBlock 
            FontWeight="Bold" 
            Text="Local Taxes"> 
           </TextBlock> 
          </GroupBox.Header> 
          <StackPanel Margin="20,8,10,0" 
             Orientation="Vertical"> 

           <local:TaxCodeMappingHeader /> 

           <!-- Note that a row is 25 high, --> 
           <ScrollViewer 
             MaxHeight="250" 
             > 
            <ItemsControl 
              Name="LocalTaxCodeMappingControl" 
              ItemTemplate="{StaticResource MappingRuleTemplate}" 
              BorderThickness="0" 
              AlternationCount="2" 
              IsTextSearchEnabled="False" 
              HorizontalContentAlignment="Stretch" 
              ItemsSource="{Binding TaxCodesCollection[0].CodeCollection, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}"> 
             <!-- ItemsSource="{Binding Source={StaticResource sortedCodeCollection}}"> --> 
            </ItemsControl> 
           </ScrollViewer> 

           <local:TaxCodeMappingFooter DataContext="{Binding RelativeSource={RelativeSource AncestorType=UserControl}}"/> 

          </StackPanel> 
         </GroupBox> 
        </Border> 
       </DockPanel> 
      </AdornerDecorator> 
     </TabItem> 
     <TabItem 
      Name="FedStateTaxesTab" 
      Padding="6,1" 
      Header="Federal\State"> 
      <AdornerDecorator> 
       <DockPanel> 
        <Border Margin="7"> 
         <GroupBox 
          Name="FedStateTaxesGroup"> 
          <GroupBox.Header> 
           <TextBlock 
            FontWeight="Bold" 
            Text="Federal \ State Taxes"> 
           </TextBlock> 
          </GroupBox.Header> 
          <StackPanel Margin="20,8,10,0" 
             Orientation="Vertical"> 

           <local:TaxCodeMappingHeader /> 

           <!-- Note that a row is 25 high, --> 
           <ScrollViewer 
             MaxHeight="250" 
             > 
            <ItemsControl 
              Name="FedStateTaxCodeMappingControl" 
              ItemTemplate="{StaticResource MappingRuleTemplate}" 
              BorderThickness="0" 
              AlternationCount="2" 
              IsTextSearchEnabled="False" 
              HorizontalContentAlignment="Stretch" 
              ItemsSource="{Binding TaxCodesCollection[1].CodeCollection, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}"> 
             <!-- ItemsSource="{Binding Source={StaticResource sortedCodeCollection}}"> --> 
            </ItemsControl> 
           </ScrollViewer> 

           <local:TaxCodeMappingFooter DataContext="{Binding RelativeSource={RelativeSource AncestorType=UserControl}}"/> 

          </StackPanel> 
         </GroupBox> 
        </Border> 
       </DockPanel> 
      </AdornerDecorator> 
     </TabItem> 
    </TabControl> 
</StackPanel> 

UserControl (TaxCodeMappingFooter)

<Button 
     Name="AddButton" 
     Grid.Row="0" 
     Grid.Column="0" 
     Height="20" Width="20" 
     Command="{Binding Path=DataContext.AddClickCommand}" 
     CommandParameter="(want the tab name here)" 
     Style="{StaticResource ImageButton}" 
     ToolTip="Add a rule" 
     local:AttachedImage.Image="{StaticResource AddImageSource}" /> 

UserControl (TaxCodeMappingFooter) содержит кнопку Добавить, что мне нужно соединять с помощью RelayCommand к VM. Мне нужно как-то сообщить виртуальной машине, что вкладка вызывает команду «Добавить», чтобы элемент можно было добавить в правильную коллекцию. Я подумал о том, чтобы отправить имя табуляции, а затем отключить его, чтобы узнать, на какой вкладке пользователь включен.

Является ли моя идея правильной или является лучшим способом сделать это, и если это правильно, как получить значение TabName, чтобы передать его в качестве CommandParameter?

+3

Если вы делаете MVVM, то я бы сказал, что лучший способ это каждая вкладка является View/ViewModel. [Один пример здесь] (http://stackoverflow.com/questions/5650812/how-do-i-bind-a-tabcontrol-to-a-collection-of-viewmodels) – bland

+0

Вы ошибаетесь. В случае MVVM вы должны использовать ViewModels для вкладок вместо жестко закодированных. В этом случае у вас будет доступ к выбранному в данный момент элементу. –

ответ

0

Если вы собираетесь жесткий код элементов управления пользовательского интерфейса, как вы сделали, то, возможно, ваш самый простой вариант, чтобы определить stringDependencyProperty в вашем TaxCodeMappingFooter управления:

public static readonly DependencyProperty TabNameProperty = DependencyProperty. 
    Register("TabName", typeof(string), typeof(TaxCodeMappingFooter)); 

public string TabName 
{ 
    get { return (string)GetTabName(TabNameProperty); } 
    set { SetTabName(TabNameProperty, value); } 
} 

Тогда вы могли бы установить его из TabItem s:

<local:TaxCodeMappingFooter TabName="FedStateTaxesTab" DataContext="{Binding 
    RelativeSource={RelativeSource AncestorType=UserControl}}" /> 

И Bind к нему внутри элемента управления:

<Button Name="AddButton" Command="{Binding Path=DataContext.AddClickCommand}" 
    CommandParameter="{Binding TabName, RelativeSource={RelativeSource 
    AncestorType=TaxCodeMappingFooter}}" ... /> 
0

Как утверждают другие, если вы правильно моделируете свою структуру модели просмотра, это не будет большой проблемой.

Если вы действительно хотите связать себя с элементом предка, вы можете использовать RelativeSourceFindAncestor, а затем указать AncestorType. Обратите внимание, что вам может потребоваться настроить AncestorLevel, если вы являетесь потомком более одного TabItem.

{Binding Path=Name 
     RelativeSource={RelativeSource Mode=FindAncestor, 
             AncestorType={x:Type TabItem}}} 

(упаковка добавил для ясности)