使用mvvm在wpf数据网格中绑定级联组合框项目源

时间:2017-03-18 06:49:14

标签: c# wpf xaml mvvm datagrid

如何根据使用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>

3 个答案:

答案 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形式。