如何根据使用mvvm的第一个下拉列表选择的第一个下拉列表来绑定第二个下拉列表
这是类结构
List<Location> Locations; //Application global cached data
List<Room> Room; //Application global cached data
class Location {LocationId, Name ....}
class Room{RoomId, Name, LocationId...}
XAML
<DataGridTemplateColumn Header="Property Name">
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox Name="LocationsComboBox"
ItemsSource="{Binding Path=DataContext.Locations, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}"
DisplayMemberPath="Name" SelectedValuePath="Id"
SelectedValue="{Binding PropertyId, UpdateSourceTrigger=PropertyChanged}">
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<!--Room Number-->
<DataGridTemplateColumn Header="Room Number">
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox Name="RoomComboBox"
ItemsSource="{Binding Path=DataContext.Rooms, RelativeSource= {RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}"
DisplayMemberPath="RoomName" SelectedValuePath="RoomId"
SelectedValue="{Binding NewRoomId, UpdateSourceTrigger=PropertyChanged}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction
Command="{Binding DataContext.PropertyChangedCommand,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}"
CommandParameter="{Binding}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
答案 0 :(得分:1)
您使用过INotifypropertychanged吗?您应该实现INotifyPropertyChanged并在更改父级时更改子列表
答案 1 :(得分:1)
我更喜欢Master Slave / Details方式的组合框。 你可以找到Here
Room ComboBox的绑定应基于所选的LocationID来自Code Behind。
以下绑定
ItemsSource =“{Binding Path = DataContext.Rooms ..
应该是这样的
ItemsSource =“{Binding Path = DataContext.RoomsInSelectedLocation
并在ViewModel中
iEnumerabe RoomsInSelectedLocation
{
返回Rooms.where(r =&gt; r.LocationId == SelectedLocationId);
}
每次“位置组合”选定项目更改时都会对此进行评估。
答案 2 :(得分:1)
使用ObservableCollection&lt; Room&gt;而不是列表(这将导致第二个组合框在第一个组合框更改位置时更新,这反过来导致房间集合发生变化。
使用ObservableCollection&lt; Location&gt;也。您的位置可能永远不会改变,但这只是一个很好的MVVM形式。