2010-06-21 14 views
1

J'ai deux ComboBox, une pour l'organisation et une pour la région. Lors de la sélection de l'organisation, je souhaite que la zone de liste déroulante Région se mette à jour avec les régions correspondantes. Après avoir sélectionné Organisation et Région, je peux taper un site dans une zone de texte et le stocker en db (mode ADD). J'ai terminé que avec ce code:Comment puis-je définir l'SelectedIndex dans un ComboBox ayant une liaison d'élément?

<ComboBox x:Name="cbOrganisation" 
     Grid.Row="0" 
     Grid.Column="1" 
     ItemsSource="{Binding OrganisationEntries}" 
     SelectedItem="{Binding SelectedOrganisation, Mode=TwoWay}" 
     SelectedIndex="{Binding SelectedOrganisationIndex}" 
     DisplayMemberPath="Description"> 
</ComboBox> 

<ComboBox x:Name="cbRegions" 
    Grid.Row="1" 
    Grid.Column="1" 
    ItemsSource="{Binding ElementName=cbOrganisation, Path=SelectedItem.Regions}" 
    SelectedItem="{Binding SelectedRegion, Mode=TwoWay}" 
    SelectedIndex="{Binding SelectedRegionIndex}" 
    DisplayMemberPath="Description" > 
</ComboBox> 

Donc, je suis en utilisant un élément à la liaison, le second ayant combobox le premier comme ItemSource.

Maintenant, j'ai un nouveau problème quand je veux éditer un site dans ma collection. En mode EDIT, je souhaite que les deux listes déroulantes soient présélectionnées et désactivées (BusinessRule permet de modifier le nom du site, et non l'organisation à laquelle il est connecté). Par conséquent, en définissant la propriété SelectedIndex sur la liste déroulante Organisation, mon organisation est sélectionnée, mais lorsqu'elle est identique sur la liste déroulante Régions, elle échoue avec une erreur de référence d'objet. Une idée de ce que je fais mal?

Répondre

1

Vous allez devoir vérifier un peu plus en profondeur votre code. J'ai fait l'échantillon rapide ci-dessous, et cela fonctionne très bien en réglant le SelectedIndex même lorsque les combos sont désactivés. Si vous essayez de définir un index trop haut ou trop bas, vous obtenez un ArgumentOutOfRangeException, pas une référence nulle. Peut-être que vous utilisez une requête Linq pour trouver un élément dans la liste mais ne vérifiez pas si un élément est réellement trouvé? Peut-être que vous essayez d'utiliser le contenu de la propriété SelectedRegion et il est null car rien n'est sélectionné?

public partial class MainPage : UserControl 
{ 
    public MainPage() 
    { 
     InitializeComponent(); 
     this.Loaded += new RoutedEventHandler(MainPage_Loaded); 
    } 

    void MainPage_Loaded(object sender, RoutedEventArgs e) 
    { 
     this.DataContext = new Data(); 

     cbOrganisation.IsEnabled = false; 
     cbRegions.IsEnabled = false; 

     cbOrganisation.SelectedIndex = 2; 
     cbRegions.SelectedIndex = 3; 
    } 
} 

public class Data 
{ 
    public Data() 
    { 
     OrganisationEntries = new List<Organisation>(); 
     OrganisationEntries.AddRange(new[] { 
               new Organisation(){ Description = "Acme Products" 
                    ,Regions=new List<Region>(){  new Region(){Code="NY", Description="New York"} 
                            ,new Region(){Code="FL", Description="Florida"} 
                           } 
                    } 
               ,new Organisation(){ Description = "Acme Investments" 
                    ,Regions=new List<Region>(){ new Region(){Code="NY",Description="New York"} 
                            ,new Region(){Code="TX", Description="Texas"} 
                           } 
                    } 
               ,new Organisation(){ Description = "Acme Inflatable Cows" 
                    ,Regions=new List<Region>(){  new Region(){Code="WY", Description="Wyoming"} 
                            ,new Region(){Code="WA",Description="Washington"} 
                            ,new Region(){Code="IO", Description="Iowa"} 
                            ,new Region(){Code="KY", Description="Kentucky"} 
                           } 
                    } 
              }); 
    } 

    public List<Organisation> OrganisationEntries { get; set; } 

    public Organisation SelectedOrganisation { get; set; } 
    public int SelectedOrganisationIndex { get; set; } 

    public Region SelectedRegion { get; set; } 
    public int SelectedRegionIndex { get; set; } 
} 

public class Organisation 
{ 
    public Organisation() 
    { 
     Regions = new List<Region>(); 
    } 
    public string Description { get; set; } 
    public List<Region> Regions { get; set; } 
} 

public class Region 
{ 
    public string Code { get; set; } 
    public string Description { get; set; } 
} 

<Grid x:Name="LayoutRoot" Background="White"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="150" /> 
     <ColumnDefinition Width="*" /> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition /> 
     <RowDefinition /> 
    </Grid.RowDefinitions> 

    <ComboBox x:Name="cbOrganisation" 
       Grid.Row="0" 
       Grid.Column="1" 
       ItemsSource="{Binding OrganisationEntries}" 
       SelectedItem="{Binding SelectedOrganisation, Mode=TwoWay}" 
       SelectedIndex="{Binding SelectedOrganisationIndex}" 
       DisplayMemberPath="Description" 
       Height="50" 
       /> 

    <ComboBox x:Name="cbRegions" 
       Grid.Row="1" 
       Grid.Column="1" 
       ItemsSource="{Binding ElementName=cbOrganisation, Path=SelectedItem.Regions}" 
       SelectedItem="{Binding SelectedRegion, Mode=TwoWay}" 
       SelectedIndex="{Binding SelectedRegionIndex}" 
       DisplayMemberPath="Description" 
       Height="50" 
       /> 


</Grid>