编辑:下面的问题已修复,在本文中转到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的示例,而不是地理课程。
现在,我们必须将
ItemsSource
的ComboBox
设置为此集合。cbCountries.ItemsSource = countries;
两者都可以在代码的后面的构造函数中。
好的,现在回到XAML!
我们将需要另一个ComboBox,以及一种告诉它动态从其他集合中获取其项的方法。
将其
ItemsSource
绑定到其他ComboBox
的选定项目仅仅是实现这一目标的最明显的方法。<ComboBox x:Name="cbRegion" ItemsSource="{Binding ElementName=cbCountries, Path=SelectedItem.Regions}"/>
这应该可以很简单地解决问题。
如果使用MVVM:
您可以绑定到
ItemsSource
中第一个ComboBox
的ViewModel
。其余的保持不变。要告诉
ViewModel
所选值是什么,请在两个SelectedItem
的ComboBox
属性上使用双向绑定,然后将其绑定到ViewModel
中具有该属性的任何属性。如果您的收藏集可以动态更改:
如果国家/地区列表(或您要使用的国家/地区列表)在运行时可以更改,则最好为
INotifyPropertyChanged
类和区域实现Country
,请使用ObservableCollection<>
。如果在运行时不需要更改,则无需理会。