DataGrid中的ComboBox:ItemSource绑定到动态资源,如何设置默认行?

时间:2014-02-12 11:32:14

标签: c# wpf xaml datagrid combobox

我正在使用WPF和实施MVP的C#项目[为学校]工作。在这段代码中,我有一个显示潜水员列表的DataGrid。第一列是Name,第二列是'DivingType'。 DivingType是内置对象,具有属性ID,例如103A。其中大约有400个存储在列表中,每个Diver('row')都有一个Dives(List<Dive>)属性,每个Dives都有一个divingType属性。

我们想要的是,此列默认显示与潜水员相关联的DivingType.ID,但下拉列表应包含所有潜水类型,以便您可以从那里更改[和更新潜水员对象]。为了进一步复杂化,这是我们作为UserControls添加到窗口的许多视图之一。

据说,这是代码。我试图减少不必要的混乱,我肯定对结果没有影响。

<Window ...>
    <Window.Resources>
        <local:Presenter x:Key="myPresenter"/>
    </Window.Resources>
    <DockPanel DataContext="{StaticResource myPresenter}">
        <UserControl ...>
            <DataGrid ItemsSource="{Binding DiverList}" x:Name="datagrid">
                    <DataGrid.Columns>
                    <DataGridTextColumn Header="Name" Width="1*" Binding="{Binding Name}"/>
                    <DataGridTemplateColumn Header="Diving type" Width="1*">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <ComboBox ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, 
                                                                Path=DataContext.DivingTypes}"
                                          DisplayMemberPath="ID"
                                          SelectedValue="{Binding Dives[0]}"
                                          SelectedValuePath="divingType">
                                </ComboBox>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>
        </UserControl>
   </DockPanel>
</Window>

当程序运行时,我在组合框内获得所有DivingTypes.ID,但没有选定的值。代码不会将任何相关错误放入输出窗口。我相信会发生的事情是它调用DivingType.Equals但是为行(Diver)而不是我指定的SelectedValuePath传递DataContext。有什么方法可以在XAML中覆盖这种行为吗?或者有更简单的方法来实现这一目标吗?

编辑: 我已经编辑了上面发布的代码:

<ComboBox ItemsSource="{
                           Binding RelativeSource={
                               RelativeSource AncestorType=UserControl
                           }, 
                           Path=DataContext.DivingTypes
                       }"
          SelectedValue="{
                            Binding Dives[0].divingType, Mode=TwoWay
                         }"
/>

这使得在开始时组合框中显示正确的值,DivingType.ID是从Diver.Dives [0] .divingType加载的,但是当我在下拉框中选择新值时它仍然没有设置属性

2 个答案:

答案 0 :(得分:2)

使用UpdateSourceTrigger = PropertyChanged。

解释here

答案 1 :(得分:0)

您是否尝试在viewmodel中实现INotifyPropertyChanged,然后在SelectedValue设置时引发PropertyChanged事件。

如果这不起作用,可以设置SelectedValue

SelectedValue="{Binding Path=divingType, Mode=TwoWay}"