2010-06-21 100 views
1

我有两个组合框,一个用于组织和一个用于区域。选择组织时,我希望区域组合框使用相关区域自行更新。选择组织和区域后,我可以在文本框中键入一个网站并将其存储到数据库(ADD模式)。我已经完成了与此代码:如何在具有元素绑定的组合框中设置SelectedIndex?

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

所以,我使用的元素元素绑定,具有第一个作为的ItemSource第二组合框。

现在,当我想编辑我的收藏中的网站时,出现了一个新问题。在编辑模式下,我希望预选和禁用两个下拉菜单(BusinessRule是我可以编辑网站名称,而不是与其连接的组织区域)。因此,通过在Organization组合框上设置SelectedIndex属性,我可以选择我的组织,但是在对区域组合框执行相同操作时,它会失败并显示对象引用错误。 任何线索我做错了什么?

回答

1

你需要检查一下你的代码。我做了下面的快速示例,即使在禁用连击时也可以很好地设置SelectedIndex。如果您尝试设置过高或过低的索引,则会得到一个ArgumentOutOfRangeException,而不是空引用。

也许您正在使用Linq查询来查找列表中的项目,但不检查项目是否实际找到?也许你正在尝试使用SelectedRegion属性的内容,并且它是空的,因为没有选中任何内容?

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> 

相关问题