Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF DataGrid-基于行动态绑定DataGridComboxColumn_C#_Wpf_Data Binding_Datagrid_Datagridcomboboxcolumn - Fatal编程技术网

C# WPF DataGrid-基于行动态绑定DataGridComboxColumn

C# WPF DataGrid-基于行动态绑定DataGridComboxColumn,c#,wpf,data-binding,datagrid,datagridcomboboxcolumn,C#,Wpf,Data Binding,Datagrid,Datagridcomboboxcolumn,我有一个可观察到的对象集合。这些对象显示在一个数据网格和一个`SelectedObject`中 我有一个属性PossibleParentObjects,它根据所选对象返回对象的列表 我想让此属性填充位于DataGrid 我该怎么做 这是我到目前为止所拥有的。。。显然不起作用: <DataGrid Grid.Row="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Alternati

我有一个
可观察到的对象集合
。这些对象显示在一个
数据网格
和一个`SelectedObject`中

我有一个属性
PossibleParentObjects
,它根据所选对象返回对象的
列表

我想让此属性填充位于
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>

请参阅其中讨论的类似问题

基本思路如下:

  • 将datagrid列绑定到viewmodel中的单个属性,我们称之为“ParentObjects”
  • 将datagrid的选定行绑定到viewmodel中的另一个属性。 在该属性的setter中,您应该检索DataGridComboBox列的组合框所需的数据项,并使用它来设置“ParentObjects”属性
这样,每当用户更改他想要查看的行时,它都会自动检索正确的对象并填充combobox列。 换句话说,您不使用组合框的源来检索它,而是在所选行发生更改时进行检索。您必须这样做-属性系统不允许参数


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

这是最终对我有效的代码。这是“答案”,但正是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>

谢谢,这让我很高兴。我“快速”让它工作的尝试失败了。我会看看另一个问题,如果我有任何问题,请发回这里。如果我能够根据您的答案和/或其他问题使其正常工作,我会将此标记为答案。