1

我在 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在数据网格的组合框中显示列表中找到的所有项目,以便我可以轻松添加和删除新成员。

这是我到目前为止的代码:

在我的视图模型中

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>

我缺少的是模板网格列中组合框上的SelectedValueor 。SelectedItem现在,在网格中,我的行数与列表中的元素相同,并且ItemsSource组合框的绑定正确,因为我可以从所有RouteSegment元素中进行选择。但是对于数据网格中的所有行,初始值始终为空。组合框的应该SelectedValue绑定到什么?

4

2 回答 2

0

DisplayMemberPath可能是您想要的。以下 ComboBox 在我的 WPF 应用程序的 DataGrid 中运行良好。(请注意,您需要更新绑定路径以使其在您的应用程序中工作。)

<ComboBox ItemsSource="{Binding Path=AllRouteSegments}" DisplayMemberPath="Name" SelectedItem="{Binding Path=SelectedMandatorySegment, UpdateSourceTrigger=PropertyChanged}"/>
于 2013-06-20T06:34:20.463 回答
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}"/>
于 2012-04-09T14:09:20.393 回答