【问题标题】:WPF DataGrid - Dynamically Bind DataGridComboBoxColumn based on rowWPF DataGrid - 基于行动态绑定 DataGridComboBoxColumn
【发布时间】:2015-08-12 16:29:27
【问题描述】:

我有一个ObservableCollection 的对象。这些对象显示在 DataGrid 和 `SelectedObject

我有一个属性 PossibleParentObjects,它根据 SelectedObject 返回对象的 List

我想让这个属性填充一个ComboBox 驻留在DataGrid 的列中

我该怎么做?

这是我到目前为止所拥有的......显然不起作用:

    <DataGrid   Grid.Row="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
            AlternatingRowBackground="AntiqueWhite" AlternationCount="2"
            ItemsSource="{Binding AllObjects, UpdateSourceTrigger=PropertyChanged}"
            SelectedItem="{Binding SelectedObject}"
            CanUserAddRows="True" CanUserDeleteRows="True"
            AutoGenerateColumns="False">

    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Name, Mode=TwoWay}" Header="Name"/>
        <DataGridTextColumn Binding="{Binding Abbr, Mode=TwoWay}" Header="Abbreviation"/>
        <DataGridComboBoxColumn Header="Parent Object" Width="120" 
            SelectedItemBinding="{Binding Path=Id, UpdateSourceTrigger=PropertyChanged}"
            DisplayMemberPath="Name"
            ItemsSource="{Binding Path=AllObjects, 
              RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}">                    
        </DataGridComboBoxColumn>
        <DataGridTextColumn Binding="{Binding Desc, Mode=TwoWay}" Header="Description"/>
    </DataGrid.Columns>

    <i:Interaction.Triggers>
        <i:EventTrigger EventName="CurrentCellChanged">
            <i:InvokeCommandAction Command="{Binding DataGridChanged}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>

</DataGrid>

【问题讨论】:

    标签: c# wpf data-binding datagrid datagridcomboboxcolumn


    【解决方案1】:

    参见this Stackoverflow question,其中讨论了类似的问题。

    基本思路如下:

    • 将 datagrid 列绑定到视图模型中的单个属性,我们称之为“ParentObjects”
    • 将数据网格的选定行绑定到视图模型中的另一个属性。 在该属性的设置器中,您应该检索 DataGridComboBox 列的组合框所需的数据项,并使用它来设置“ParentObjects”属性

    这样,每当用户更改他想查看的行时,它都会自动检索正确的对象并填充组合框列。 换句话说,您不会使用组合框的源来检索它,而是在更改所选行时检索它。您必须这样做 - 属性系统不允许参数。

    我知道这是我在这里给出的一般描述,而不是代码,但我想你会明白要点的。

    【讨论】:

    • 谢谢,那是因为。我让它工作的“快速”尝试失败了。我会看看另一个问题,如果我有任何问题,请回到这里。如果我能够根据您的回答和/或其他问题使其正常工作,我会将其标记为答案。
    【解决方案2】:

    这是最终为我工作的最终代码。这是“答案”,但正是 Nepdev 的答案让我来到了这里。希望这会帮助其他人尝试做类似的事情。

        <DataGrid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" HeadersVisibility="Column"
          AlternatingRowBackground="AntiqueWhite" AlternationCount="2"
          ItemsSource="{Binding EquipLocations, UpdateSourceTrigger=PropertyChanged}"
          SelectedItem="{Binding SelectedItem}"
          CanUserAddRows="True" CanUserDeleteRows="True"
          AutoGenerateColumns="False">
    
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding Name, Mode=TwoWay}" Header="Name"/>
                <DataGridTextColumn Binding="{Binding Abbr, Mode=TwoWay}" Header="Abbreviation"/>
    
                <DataGridComboBoxColumn Header="Uses Location" Width="120" 
        SelectedValueBinding="{Binding Path=ParentObjectId, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
        SelectedValuePath="Id"
        DisplayMemberPath="Abbr">
                    <DataGridComboBoxColumn.ElementStyle>
                        <Style TargetType="ComboBox">
                            <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, 
                    Path=DataContext.AllPossibleObjects}"/>
                        </Style>
                    </DataGridComboBoxColumn.ElementStyle>
                    <DataGridComboBoxColumn.EditingElementStyle>
                        <Style TargetType="ComboBox">
                            <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, 
                    Path=DataContext.PossibleParentObjects}"/>
                        </Style>
                    </DataGridComboBoxColumn.EditingElementStyle>
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="SelectionChanged">
                            <i:InvokeCommandAction Command="{Binding DataGridChanged}"/>
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                </DataGridComboBoxColumn>
    
                <DataGridTextColumn Binding="{Binding Desc, Mode=TwoWay}" Header="Description"/>
            </DataGrid.Columns>
    
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="CurrentCellChanged">
                    <i:InvokeCommandAction Command="{Binding DataGridChanged}"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
    
        </DataGrid>
    

    【讨论】:

      猜你喜欢
      • 2017-08-05
      • 2018-01-22
      • 2012-11-10
      • 1970-01-01
      • 1970-01-01
      • 2014-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多