编辑:下面的问题已修复,在本文中转到EDIT2。

我有一个组织实体和一个地区实体。一个类型为Organization的对象可以连接一个或多个Region对象,因此我在Region实体中具有Organization Entity的外键。使用WCF RIA和实体框架从我的数据库中提取Organization和Region对象。我想将“组织”对象放在一个ComboBox中,将“区域”对象放在另一个ComboBox中,当选择一个具有“ Region”对象的ComboBox的组织时,只会自动显示连接到所选组织的区域。应该是非常基本的,但是我现在设计它的方式根本不起作用。

那么,关于如何实现这一目标的任何提示?一个简单的简单代码示例值得赞赏!
(我正在使用SL4,WCF RIA MVVM)

EDIT2 EDIT2 EDIT2 EDIT2 EDIT2 EDIT2 EDIT2 EDIT2 EDIT2 EDIT2 EDIT2 EDIT2 EDIT2:

现在,当我想向集合中添加新对象时,使用Venomo的ElemntBinding答案对我来说非常有用,我只是拉出可用的国家/地区和连接的区域,然后在文本框中键入站点...所以我得到了我的数据库中组织,区域和站点的组合:)

现在,当我要编辑集合中的网站时遇到了一个新问题。在EDIT模式下,我希望两个下拉列表被预先选择并禁用(BusinessRule是我可以编辑站点名称,而不是它连接到的组织或区域)。因此,通过在“组织”组合框上设置SelectedIndex属性,可以选择我的组织,但是在“区域”组合框上执行相同操作时,它会失败,并出现“对象引用”错误。

最佳答案

您可以使用一些聪明的ElementBinding来实现。

基本示例:

假设我们有一个像这样的简单类:

public class Country
{
    public string Name { get; set; }

    public IEnumerable<string> Regions { get; set; }
}


然后,我们将有两个ComboBox:一个用于选择国家/地区,另一个用于选择该国家/地区中的地区。当第一个值更改时,第二个应更新自身。

好的,首先我们必须告诉Silverlight如何显示Country。对于复杂的场景,我们可以使用DataTemplate,但是现在,我们只需要ComboBox类的DisplayMemberPath属性。

<ComboBox x:Name="cbCountries" DisplayMemberPath="Name"/>


因此,我们在后面的代码中创建了这些对象的简单集合:

var countries = new List<Country>()
{
    new Country
    {
        Name = "USA",
        Regions = new List<string>
        {
            "Texas", "New York", "Florida", ...
        },
    },
    new Country
    {
        Name = "UK",
        Regions = new List<string>
        {
            "Scotland", "Wales", "England", ...
        },
    },
    ...
};


我知道这些不是示例国家中的所有区域,但这是Silverlight的示例,而不是地理课程。

现在,我们必须将ItemsSourceComboBox设置为此集合。

cbCountries.ItemsSource = countries;


两者都可以在代码的后面的构造函数中。
好的,现在回到XAML!

我们将需要另一个ComboBox,以及一种告诉它动态从其他集合中获取其项的方法。
将其ItemsSource绑定到其他ComboBox的选定项目仅仅是实现这一目标的最明显的方法。

<ComboBox x:Name="cbRegion" ItemsSource="{Binding ElementName=cbCountries, Path=SelectedItem.Regions}"/>


这应该可以很简单地解决问题。

如果使用MVVM:

您可以绑定到ItemsSource中第一个ComboBoxViewModel。其余的保持不变。
要告诉ViewModel所选值是什么,请在两个SelectedItemComboBox属性上使用双向绑定,然后将其绑定到ViewModel中具有该属性的任何属性。

如果您的收藏集可以动态更改:

如果国家/地区列表(或您要使用的国家/地区列表)在运行时可以更改,则最好为INotifyPropertyChanged类和区域实现Country,请使用ObservableCollection<>
如果在运行时不需要更改,则无需理会。

10-04 12:03