WPF MVVM和父子组合框

时间:2012-12-18 10:36:45

标签: wpf data-binding mvvm combobox

我确定我已经在StackOverflow上找到了这个,但我似乎不够聪明才能再找到它

我想做的事(在使用MVVM的WPF中)是这样的:

cmbSelectedAddressRegion: populated with the list of region
cmbSelectedAddressCities: populated with the list of cities in that region

当用户点击cmbSelectedAddressRegion中的某个区域时,cmbSelectedAddressCities中的项目应该只是该地区的城市

我有像这样的XAML

    <ComboBox Name="cmbSelectedAddressRegion" 
SelectedValue="{Binding Path=selectedAddressItemRegion, UpdateSourceTrigger=PropertyChanged}" 
IsEnabled="{Binding Path=selectedAddressIsEnabled}" 
Style="{StaticResource style_flat_ComboBox}"></ComboBox>

    <ComboBox Name="cmbSelectedAddressCities" 
SelectedValue="{Binding Path=selectedAddressIdCities, UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="id" 
SelectedValuePath="id" 
ItemsSource="{Binding ElementName=cmbSelectedAddressRegion, Path=SelectedItem.Cities}" IsEnabled="{Binding Path=selectedAddressIsEnabled}" 
Style="{StaticResource style_flat_ComboBox}"></ComboBox>

当我点击cmbSelectedAddressRegion中的某个区域时,正确填充了cmbSelectedAddressCities

我还有一个包含大量vmCustomer的虚拟机DependencyProperties(其中包括selectedAddressItemRegionselectedAddressIdCities) 当我从主列表中选择客户时(窗口中包含客户列表的另一个组合框)我看到cmbSelectedAddressRegion正确显示了区域,但我在cmbSelectedAddressCities中没有看到任何内容。如果我点击cmbSelectedAddressRegion再次填充cmbSelectedAddressCities并选择当前选定的城市(vmCustomer

cmbSelectedAddressRegion.itemssource被绑定(在文件后面的bode中)到ObservableCollection(of vmAddressRegion) 除了其他DependencyProperties之外,每个vmAddressRegion都有一个cities属性,它返回ObservableCollection(of vmAddressCities)

创建窗口时会填充ObservableCollection(of vmAddressRegion)。同时,对于ObservableCollection(of vmAddressRegion)(类型为vmAddressRegion)的每个项目,ObservableCollection(of vmAddressCities)都会填充相应的项目)

我希望我已经足够清楚了 有任何建议如何解决上述问题(cmbSelectedAddressCities没有“填充”)?

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

需要小心处理WPF ComboBox。如果ItemsSource和SelectedValue / SelectedItem以“错误”顺序更改,则绑定很容易混淆,特别是如果您使用SelectedValue。

我的建议是用“SelectedItem”替换“SelectedValue”绑定。绑定表达式可以保持不变(尽管我认为您不需要指定UpdateSourceTrigger)。

绑定到SelectedItem意味着 vmCustomer 需要 selectedAddressCity 属性而不是selectedAddressIdCity id(并且您可以删除cmbSelectedAddressCities的SelectedValuePath)。

答案 1 :(得分:0)

很抱歉长时间拖延。

我知道我答应在本周结束时回复我的解决方案,但我的电脑决定第二天就死了。 关于我原来的问题,我采用了2个“解决方案”。 首先,我删除了数字ID,将其更改为Region / City的完整描述。我认为这很好,但问题仍然存在于一些“奇怪”的情况下(例如,当第一次点击Region组合框时。 在代码中挖了一段时间后,我发现真正的问题出在我为应用程序编写的转换器中。在转换过程中,我犯了一个错误:而不是“ if isnothing ”我写了“ if not isnnothing ”,结果却没有转化为太空,弄乱了整个父亲 - 孩子的关系。 我担心的是,问题出在我的代码中,而不是我在这里发布的代码中。

我再次感谢大家,并再次为延迟道歉