1

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

<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 属性,我选择了我的组织,但是在区域组合框上执行相同操作时,它会因对象引用错误而失败。任何线索我做错了什么?

4

1 回答 1

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>

于 2010-06-21T09:03:50.063 回答