【问题标题】:How can I set the SelectedIndex in a ComboBox having element binding?如何在具有元素绑定的 ComboBox 中设置 SelectedIndex?
【发布时间】:2011-03-06 04:58:49
【问题描述】:

我有两个组合框,一个用于组织,一个用于区域。选择组织时,我希望区域组合框使用相关区域进行自我更新。选择组织和区域后,我可以在文本框中输入站点并将其存储到数据库(添加模式)。我已经用这段代码完成了:

<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 是我可以编辑站点名称,而不是它连接到的组织 og 区域)。因此,通过在组织组合框上设置 SelectedIndex 属性,我选择了我的组织,但是在区域组合框上执行相同操作时,它会因对象引用错误而失败。 任何线索我做错了什么?

【问题讨论】:

    标签: data-binding mvvm combobox silverlight-4.0 selectedindex


    【解决方案1】:

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

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

    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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-02
      • 1970-01-01
      • 2021-05-19
      • 1970-01-01
      • 2020-02-04
      相关资源
      最近更新 更多