Как я могу установить SelectedIndex в ComboBox с привязкой элемента? - PullRequest
1 голос
/ 21 июня 2010

У меня есть два комбинированных списка, один для организации и один для региона.При выборе организации я хочу, чтобы выпадающий список регионов обновлялся со связанными регионами.После выбора организации и региона я могу ввести сайт в текстовое поле и сохранить его в БД (режим ADD).Я завершил это с помощью этого кода:

<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 заключается в том, что я могу редактировать имя места, а не то, к какой организации или региону он подключен).Поэтому, установив свойство SelectedIndex в выпадающем списке «Организация», я выбираю свою организацию, но при выполнении этого действия в выпадающем списке «Регионы» происходит сбой с ошибкой ссылки на объект.Любая подсказка, что я делаю не так?

1 Ответ

1 голос
/ 21 июня 2010

Вам нужно будет немного углубиться в свой код. Я сделал быстрый пример ниже, и он отлично работает, установив 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; }
}

</p> <pre><code><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>

...