我正在使用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加载的,但是当我在下拉框中选择新值时它仍然没有设置属性
答案 0 :(得分:2)
使用UpdateSourceTrigger = PropertyChanged。
解释here。
答案 1 :(得分:0)
您是否尝试在viewmodel中实现INotifyPropertyChanged,然后在SelectedValue设置时引发PropertyChanged事件。
如果这不起作用,可以设置SelectedValue
SelectedValue="{Binding Path=divingType, Mode=TwoWay}"