1

組織用と地域用の 2 つの ComboBox があります。組織を選択すると、地域コンボボックスが関連する地域で更新されます。組織と地域を選択した後、サイトをテキスト ボックスに入力して、データベースに保存できます (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>

したがって、要素間のバインディングを使用しており、2 番目のコンボボックスには最初のコンボボックスが ItemSource として含まれています。

ここで、コレクション内のサイトを編集したいときに新しい問題が発生しました。編集モードでは、2 つのドロップダウンを事前に選択して無効にする必要があります (BusinessRule は、接続先の組織や地域ではなく、サイト名を編集できるということです)。そのため、Organization コンボボックスで SelectedIndex プロパティを設定すると、組織が選択されますが、Regions コンボボックスで同じことを行うと、オブジェクト参照エラーで失敗します。私が間違っていることの手がかりはありますか?

4

1 に答える 1

1

コードをもう少し詳しくチェックする必要があります。以下の簡単なサンプルを作成しましたがSelectedIndex、コンボが無効になっている場合でも問題なく動作します。高すぎるか低すぎるインデックスを設定しようとするとArgumentOutOfRangeException、null 参照ではなく が返されます。

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>

于 2010-06-21T09:03:50.063 に答える