Data binding 如何在具有元素绑定的组合框中设置SelectedIndex?

Data binding 如何在具有元素绑定的组合框中设置SelectedIndex?,data-binding,mvvm,combobox,silverlight-4.0,selectedindex,Data Binding,Mvvm,Combobox,Silverlight 4.0,Selectedindex,我有两个组合框,一个用于组织,一个用于区域。选择组织时,我希望区域组合框使用相关区域进行自我更新。选择组织和地区后,我可以在文本框中键入站点并将其存储到db(添加模式)。我已经用这个代码完成了: <ComboBox x:Name="cbOrganisation" Grid.Row="0" Grid.Column="1" ItemsSource="{Binding OrganisationEntries}" SelectedItem="{Bi

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

<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属性,我可以选择我的组织,但在Regions(区域)组合框上执行相同操作时,会失败,并出现对象引用错误。
知道我做错了什么吗?

您需要更深入地检查代码。我完成了下面的快速示例,它可以很好地设置
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; }
}
public部分类主页面:UserControl
{
公共主页()
{
初始化组件();
this.Loaded+=新的RoutedEventHandler(主页面_-Loaded);
}
已加载无效主页(对象发送器、路由目标)
{
this.DataContext=新数据();
cborganization.IsEnabled=假;
cbRegions.IsEnabled=false;
cborganization.SelectedIndex=2;
cbRegions.SelectedIndex=3;
}
}
公共类数据
{
公共数据()
{
OrganizationEntries=新列表();
OrganizationEntries.AddRange(新[]{
新组织(){Description=“Acme产品”
,Regions=new List(){new Region(){Code=“NY”,Description=“new York”}
,new Region(){Code=“FL”,Description=“Florida”}
}
}
,新组织(){Description=“Acme Investments”
,Regions=new List(){new Region(){Code=“NY”,Description=“new York”}
,new Region(){Code=“TX”,Description=“Texas”}
}
}
,新组织(){Description=“Acme”
,Regions=new List(){new Region(){Code=“WY”,Description=“Wyoming”}
,new Region(){Code=“WA”,Description=“Washington”}
,new Region(){Code=“IO”,Description=“Iowa”}
,new Region(){Code=“KY”,Description=“Kentucky”}
}
}
});
}
公共列表组织条目{get;set;}
公共组织选择组织{get;set;}
public int selectedorganizationindex{get;set;}
公共区域SelectedRegion{get;set;}
public int SelectedRegionIndex{get;set;}
}
公营班级组织
{
公共组织()
{
区域=新列表();
}
公共字符串说明{get;set;}
公共列表区域{get;set;}
}
公共类区域
{
公共字符串代码{get;set;}
公共字符串说明{get;set;}
}



您需要更深入地检查代码。我完成了下面的快速示例,它可以很好地设置
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; }
}
public部分类主页面:UserControl
{
公共主页()
{
初始化组件();
this.Loaded+=新的RoutedEventHandler(主页面_-Loaded);
}
已加载无效主页(对象发送器、路由目标)
{
this.DataContext=新数据();
cborganization.IsEnabled=假;
cbRegions.IsEnabled=false;
cborganization.SelectedIndex=2;
cbRegions.SelectedIndex=3;
}
}
公共类数据
{
公共数据()
{
OrganizationEntries=新列表();
OrganizationEntries.AddRange(新[]{