我在WPF MVVM应用程序中有一个类,我希望以弹出形式显示它并管理它的一些成员。
public class Route
{
public string Name { get; set; }
public List<RouteSegment> MandatorySegments { get; set; }
}
public class RouteSegment
{
public decimal Id { get; set; }
public string Name { get; set; }
}
我只添加了一些成员字段,其余字段不相关。
我想要做的是在数据网格中的组合框中显示MandatorySegments
列表中找到的所有项目,以便我可以轻松添加和删除新成员。
这是我到目前为止的代码:
在我的ViewModel
中public RouteTest SelectedRoute { get; set; }
public ObservableCollection<RouteSegment> AllRouteSegments { get; private set; }
public RouteSegment SelectedMandatorySegment { get; set; }
在我的视图中
<DataGrid Grid.RowSpan="2"
AutoGenerateColumns="False" HorizontalAlignment="Left" Margin="5,6,0,5" Name="dgMandatorySegments" VerticalAlignment="Stretch" Width="306"
ItemsSource="{Binding SelectedRouteTest.MandatorySegments, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" CanUserResizeRows="False" CanUserSortColumns="False" CanUserResizeColumns="False" CanUserReorderColumns="False"
CanUserAddRows="{StaticResource False}" SelectionMode="Single" SelectedItem="{Binding SelectedMandatorySegment, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Route Segment">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding DataContext.AllRouteSegments, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"
ItemTemplate="{StaticResource CboxItemTemplate}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
我缺少的是模板化网格列中组合框上的SelectedValue
或SelectedItem
。现在,在网格中,我的行数与列表中的元素数相同,并且组合框的ItemsSource
绑定正确,因为我可以从所有RouteSegment
元素中进行选择。但是对于datagrid中的所有行,初始值始终为空。
组合框的SelectedValue
应该绑定什么?
答案 0 :(得分:0)
这取决于您是希望所有行具有相同的默认值 - 还是与行无关的初始值。我建议您使用SelectedItem
来避免SelectedValue
无法正常工作的问题。您当前的VM只允许一个选定的必需段 - 在此假设下,您只需为所有网格行设置一个默认值。
<ComboBox ItemsSource="{Binding DataContext.AllRouteSegments, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"
SelectedItem="{Binding DataContext.SelectedMandatorySegment, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"
ItemTemplate="{StaticResource CboxItemTemplate}"/>
答案 1 :(得分:0)
DisplayMemberPath 可能就是您想要的。以下ComboBox在我的WPF应用程序中的DataGrid中运行良好。 (请注意,您需要更新绑定路径以使其在您的应用程序中正常工作。)
<ComboBox ItemsSource="{Binding Path=AllRouteSegments}" DisplayMemberPath="Name" SelectedItem="{Binding Path=SelectedMandatorySegment, UpdateSourceTrigger=PropertyChanged}"/>