2012-04-09 121 views
1

我有一个WPF MVVM应用程序中的类,我想以弹出窗体的形式显示并管理它的一些成员。WPF绑定到DataGridTemplateColumn中的组合框

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> 

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

回答

0

这取决于您是否想要所有行的相同默认值 - 或独立于行的初始值。我建议您使用SelectedItem以避免SelectedValue无法可靠工作。当前虚拟机只允许一个选定的强制性分段 - 假设这个假设,您只为所有网格行设置了一个默认值。

<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}"/> 
+0

我希望所有行的行独立值。例如,组合框项目源包含100个项目,但是我的Route.MandatorySegments只有5个项目。因此,datagrid中的每一行都将包含一个组合框,其初始值分别为这5个项目中的每一个设置。 我会尝试你的实现,谢谢。 – Adrian 2012-04-09 14:15:06

+0

使用'DataContext.SelectedMandatorySegment'不起作用。我是否需要以某种方式包装'DataContext.AllRouteSegments'的元素?每行如何知道如何绑定到Route.MandatorySegments中的每个元素? – Adrian 2012-04-09 15:43:48

+0

你在ctor中将'SelectedMandatorySegment'分配一个默认值吗? 'SelectedMandatorySegment'还应实现['INotifyPropertyChanged'](http://msdn.microsoft.com/en-us/library/ms743695.aspx)以查看UI中的任何更新。 – SliverNinja 2012-04-09 18:49:06

0

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

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