2013-03-20 1 views
0

J'ai créé un projet basé sur des onglets imbriqués. Les onglets imbriqués sont une instance différente du même modèle viem et de la même interface utilisateur. lorsque je bascule entre les onglets que les comboboxes présentent dans les onglets de la sélection chenge thei en fonction de l'onglet qui est en train de perdre le focus.Modification de la sélection ComboBox WPF après changement d'onglet

J'ajoute à la fois les viewmodels et la vue de mon projet de test. vous remercie d'avance pour votre aide

fenêtre principale

<Window.Resources> 

    <DataTemplate DataType="{x:Type local:IntermediateViewModel}"> 
     <local:IntermediateView /> 
    </DataTemplate> 

    <DataTemplate x:Key="HeaderedTabItemTemplate"> 
     <Grid> 
      <ContentPresenter 
         Content="{Binding Path=Header, UpdateSourceTrigger=PropertyChanged}" 
         VerticalAlignment="Center" > 
      </ContentPresenter> 
     </Grid> 
    </DataTemplate> 

    <Style x:Key="SimpleTabItemStyle" TargetType="TabItem"> 
     <Setter Property="Foreground" Value="White"/> 
     <Setter Property="FontWeight" Value="Bold"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type TabItem}"> 
        <Grid> 
         <Border Name="Border" BorderThickness="1" BorderBrush="#555959"> 
          <ContentPresenter x:Name="ContentSite" VerticalAlignment="Center" HorizontalAlignment="Center" 
           ContentSource="Header" Margin="12,2,12,2" RecognizesAccessKey="True" Height ="40" MinWidth ="90"/> 
         </Border> 
        </Grid> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsSelected" Value="True"> 
          <Setter TargetName="Border" Property="Background" Value="#555959" /> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

    <DataTemplate x:Key="DefaultTabControlTemplate"> 
     <TabControl IsSynchronizedWithCurrentItem="True" 
         BorderThickness="0" 
         ItemsSource="{Binding}" 
         ItemTemplate="{StaticResource HeaderedTabItemTemplate}" 
         ItemContainerStyle="{StaticResource SimpleTabItemStyle}" 
         SelectionChanged="TabControl_SelectionChanged" 
         /> 
    </DataTemplate> 


    <!----> 


</Window.Resources> 

<Grid MinHeight="200" MinWidth="300"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="260*" /> 
     <RowDefinition Height="51*" /> 
    </Grid.RowDefinitions> 
    <Border > 
     <ContentControl 
      Content="{Binding Path=Workspaces}" 
      ContentTemplate="{DynamicResource DefaultTabControlTemplate}" 
      /> 
    </Border> 
    <Button Grid.Row="1" Content="Add" Command="{Binding AddCommand}"/> 
</Grid> 

modèle de vue (créer un autre istance à chaque fois)

class MainWindowViewModel : WorkspacesViewModel<IntermediateViewModel> 
{ 
    public MainWindowViewModel() 
    { 
     this.WorkspacesView.CurrentChanged += new EventHandler(WorkspacesView_CurrentChanged); 
    } 

    void WorkspacesView_CurrentChanged(object sender, EventArgs e) 
    { 
    } 

    RelayCommand myVar = null; 
    public ICommand AddCommand 
    { 
     get 
     { 
      return myVar ?? (myVar = new RelayCommand(param => 
      { 
       SetWindow(new IntermediateViewModel("AA" + this.Workspaces.Count)); 
      })); 
     } 
    } 

premier onglet Niveau

<UserControl.Resources> 

    <DataTemplate DataType="{x:Type local:ClassViewModel}"> 
     <local:ClassView /> 
    </DataTemplate> 
</UserControl.Resources> 

<Border> 
    <ContentControl Content="{Binding Path=CurrentWorkspace, Mode=OneWay}" Loaded="ContentControl_Loaded" DataContextChanged="ContentControl_DataContextChanged" IsVisibleChanged="ContentControl_IsVisibleChanged" LayoutUpdated="ContentControl_LayoutUpdated" TargetUpdated="ContentControl_TargetUpdated" Unloaded="ContentControl_Unloaded" /> 
</Border> 

premier niveau viewmodel

classe IntermediateViewModel: WorkspacesViewModel { chaîne publique en-tête {get; ensemble; }

public IntermediateViewModel(string header) 
    { 
     Header = header; 
     SetWindow(new ClassViewModel(header)); 
    } 
} 

onglet imbriqué

<UserControl.Resources> 
    <CollectionViewSource x:Key="StatusView" Source="{Binding Path=StatusList}"/> 
</UserControl.Resources> 
<Grid> 
    <ComboBox Name="_spl2Status" ItemsSource="{Binding Source={StaticResource StatusView}}" 
     SelectedValue="{Binding Path=MyProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
     SelectedValuePath="FL_TYPE" 
     DisplayMemberPath="ID_TYPE" Margin="76,12,0,0" Height="40" VerticalAlignment="Top" HorizontalAlignment="Left" Width="146" 
       DataContextChanged="_spl2Status_DataContextChanged" 
       IsVisibleChanged="_spl2Status_IsVisibleChanged" 
       Loaded="_spl2Status_Loaded" 
       SelectionChanged="_spl2Status_SelectionChanged" 
       > 
    </ComboBox> 
</Grid> 

modèle de vue de l'onglet imbriqué

public enum myTypes 
{ 
    tipo0 = 0, 
    tipo1 = 1, 
    tipo2 = 2, 
} 

class ClassViewModel : WorkspaceViewModel 
{ 
    public ClassViewModel(string name) 
    { 
     Name = name; 
    } 

    public string Name { get; set; } 

    private List<IntEnumType> _statusList = null; 
    public List<IntEnumType> StatusList 
    { 
     get 
     { 
      if (_statusList == null) 
       _statusList = new List<IntEnumType>() 
       { 
        new IntEnumType((int)myTypes.tipo0, myTypes.tipo0.ToString()), 
        new IntEnumType((int)myTypes.tipo1, myTypes.tipo1.ToString()), 
        new IntEnumType((int)myTypes.tipo2, myTypes.tipo2.ToString()), 
       }; 
      return _statusList; 
     } 
    } 

    private int myVar = 1; 
    public int MyProperty 
    { 
     get 
     { 
      return myVar; 
     } 
     set 
     { 
      if (myVar != value) 
      { 
       myVar = value; 
       OnPropertyChanged(() => MyProperty); 
      } 
     } 
    } 
} 

public class TabItemStyleSelector : StyleSelector 
{ 
    public Style MainTabItem { get; set; } 
    public Style ChildrenTabItem { get; set; } 
    public Style SpecificationTabItem { get; set; } 

    public override Style SelectStyle(object item, DependencyObject container) 
    { 
     //if (item is IHome) 
     // return MainTabItem; 
     //else if (item is SpecificationItemViewModel) 
     // return SpecificationTabItem; 
     //else 
      return ChildrenTabItem; 
    } 
} 

Répondre

1

Le code est un peu difficile à suivre complètement, mais je suppose que la question est qu'il ya seulement une instance de votre ClassViewModel et c'est où la sélection pour la zone de liste déroulante est stockée {Binding Path=MyProperty, donc tout ce qui est stocké dans MyProperty sera reflété dans tout i conditions de la combo box, quel que soit l'endroit où ils vivent.

+0

non, il y a 2 viewmodels .. Si vous avez une zone de texte avec deux valeurs différentes cela fonctionne, le problème est juste avec la combobox – andrea

+0

Ensuite, s'il vous plaît poster le 2ème viewmodel. Les deux liés à la même SelectedValue ou SelectedIndex expliqueraient ce comportement. – Paparazzi

+0

ajouté également les autres viewmodels – andrea

-2

Le problème est dans vos gestionnaires d'événements chargés.

Lorsque vous changez d'onglet, vous déchargez un onglet et vous en chargez un nouveau.

Je suppose que vous changez MyComboBox.SelectedIndex en _spl2Status_Loaded.

Questions connexes