WPF MVVM模式下DevExpress ComboBoxEdit ItemsSource绑定失效,下拉值无法加载问题
解决DevExpress Grid中ComboBoxEdit下拉值无法加载的问题
这个问题我太熟悉了——你遇到的是WPF DevExpress Grid里CellTemplate的DataContext绑定陷阱!
问题根源
GridControl的CellTemplate中,每个单元格的DataContext默认是当前行对应的MarketOwnershipMappingModel对象,而你的DefaultUsers和OverrideUsers集合显然是定义在ViewModel(也就是GridControl的DataContext)里的,不是行模型的属性。直接写{Binding Path=DefaultUsers}自然找不到数据源,下拉列表也就加载不出来了。
解决方案:绑定到ViewModel的DataContext
我们可以通过RelativeSource或者ElementName来绕过行数据的DataContext,直接绑定到ViewModel里的集合。下面是修改后的完整代码:
修正后的GridControl列代码
<dxg:GridControl x:Name="OwnershipGrid" ItemsSource="{Binding Path=MarketOwnershipSettings.MarketOwnershipMapping, Mode=TwoWay}" SelectedItem="{Binding SelectedMapping}" SelectionMode="Row"> <dxg:GridControl.View> <dxg:TableView x:Name="OwnershipView" ShowSearchPanelFindButton="False" ShowSearchPanelMode="Never" ShowFilterPanelMode="Never" AllowBestFit="True" ShowGroupPanel="False" AllowResizing="True"> </dxg:TableView> </dxg:GridControl.View> <dxg:GridControl.Columns> <dxg:GridColumn FieldName="MarketGroupId" Header="Market Group" AllowEditing="False" Width="80" /> <!-- 修正DefaultUser列的ComboBox绑定 --> <dxg:GridColumn FieldName="DefaultUser" Header="Default User" Width="80"> <dxg:GridColumn.CellTemplate> <DataTemplate> <dxe:ComboBoxEdit x:Name="PART_Editor" ItemsSource="{Binding DataContext.DefaultUsers, RelativeSource={RelativeSource AncestorType=dxg:GridControl}}" /> </DataTemplate> </dxg:GridColumn.CellTemplate> </dxg:GridColumn> <!-- 修正OverrideUser列的ComboBox绑定,同时调整SelectedItem --> <dxg:GridColumn FieldName="OverrideUserId" Header="Override User" Width="90"> <dxg:GridColumn.CellTemplate> <DataTemplate> <dxe:ComboBoxEdit x:Name="PART_Editor" ItemsSource="{Binding DataContext.OverrideUsers, RelativeSource={RelativeSource AncestorType=dxg:GridControl}, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" SelectedItem="{Binding OverrideUser}" /> </DataTemplate> </dxg:GridColumn.CellTemplate> </dxg:GridColumn> </dxg:GridControl.Columns> </dxg:GridControl>
额外注意事项
- SelectedItem绑定修正:原来的
SelectedMapping.OverrideUser是ViewModel里选中行的属性,但CellTemplate里的DataContext是当前行数据,所以直接绑定行模型的OverrideUser属性即可,这样每行的选择才会独立生效。 - 集合类型要求:确保ViewModel里的
DefaultUsers和OverrideUsers是ObservableCollection<T>类型,并且ViewModel实现了INotifyPropertyChanged接口,这样集合动态更新时下拉列表也能同步刷新。 - 值与显示分离:如果
OverrideUserId存储的是用户ID,而ComboBox绑定的是用户对象,需要添加ValueMember和DisplayMember来关联:<dxe:ComboBoxEdit x:Name="PART_Editor" ItemsSource="{Binding ...}" ValueMember="UserId" DisplayMember="UserName" Value="{Binding OverrideUserId}" />
内容的提问来源于stack exchange,提问作者bhumika jaisinghani
相关产品推荐
相关产品推荐

