【问题标题】:WPF binding to combobox in DataGridTemplateColumnWPF 绑定到 DataGridTemplateColumn 中的组合框
【发布时间】:2012-04-21 21:18:18
【问题描述】:

我在 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>

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

【问题讨论】:

    标签: wpf mvvm datagrid combobox


    【解决方案1】:

    这取决于您是否希望所有行都使用相同的默认值 - 还是与行无关的初始值。我建议您使用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}"/>
    

    【讨论】:

    • 我想要所有行的行独立值。例如,组合框项目源有 100 个项目,但我的 Route.MandatorySegments 只有 5 个项目。因此,数据网格中的每一行都将包含一个组合框,其初始值分别为这 5 个项目中的每一个设置。我会试试你的实现,谢谢。
    • 使用DataContext.SelectedMandatorySegment 不起作用。我可能需要以某种方式包装DataContext.AllRouteSegments 的元素吗?每行如何知道如何绑定到Route.MandatorySegments 中的每个元素?
    • 您是否在 ctor 中为 SelectedMandatorySegment 分配了默认值? SelectedMandatorySegment 还应该实现 INotifyPropertyChanged 以查看 UI 中的任何更新。
    • 不,我没有为SelectedMandatorySegment 分配初始值。我使用这个变量来访问网格中选定的行(所以我可以在不同的面板中显示一些额外的信息)。从类的定义方式可以看出,我需要将combobox的SelectedItem绑定到List&lt;RouteSegment&gt; MandatorySegments的成员上。这就是我遇到的麻烦..
    【解决方案2】:

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

    <ComboBox ItemsSource="{Binding Path=AllRouteSegments}" DisplayMemberPath="Name" SelectedItem="{Binding Path=SelectedMandatorySegment, UpdateSourceTrigger=PropertyChanged}"/>
    

    【讨论】:

      猜你喜欢
      • 2011-09-06
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-19
      • 2019-05-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多