WPF Datagrid Combobox SelectedItem 未正确绑定到 Powershell 对象

Posted

技术标签:

【中文标题】WPF Datagrid Combobox SelectedItem 未正确绑定到 Powershell 对象【英文标题】:WPF Datagrid Combobox SelectedItem not Binding to Powershell Object correctly 【发布时间】:2017-05-21 05:31:18 【问题描述】:

我在将我的 Datagrid ComboBox 选定项正确绑定到我的 PowerShell 对象时遇到了一些问题。我正在使用带有“UpdateSourceTrigger=PropertyChanged”参数的 ComboBox 的双向绑定。源对象正确地作为项目添加到组合框,并且源对象将随着选择的更改而更新。但是,当我保存对象或第一次启动时,所选项目不会被绑定。而是将所有 ComboBox 生成为没有选定值。

XAML:

          <DataGrid Name="CustomDescription_Fields_DG" HorizontalAlignment="Left" Width="626" Margin="185,113,0,87" IsReadOnly="True" AutoGenerateColumns="False" GridLinesVisibility="None" AlternatingRowBackground="#FFEFEFF2" >
            <DataGrid.Columns>
                <DataGridTextColumn Binding="Binding Field" Header="Applied Fields" Width="395"/>
                <DataGridTemplateColumn Header="Position" Visibility="Visible" Width="60">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox SelectedItem="Binding Path=Position, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged" ItemsSource="Binding ItemCount"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
            <DataGrid.CellStyle>
                <Style TargetType="x:Type DataGridCell">
                    <Style.Triggers>
                        <Trigger Property="DataGridCell.IsSelected" Value="True">
                            <Setter Property="BorderBrush">
                                <Setter.Value>
                                    <SolidColorBrush Color="Transparent"/>
                                </Setter.Value>
                            </Setter>
                            <Setter Property="Foreground"
                        Value="DynamicResource
                               x:Static SystemColors.ControlTextBrushKey"/>
                            <Setter Property="Background">
                                <Setter.Value>
                                    <SolidColorBrush Color="Transparent"/>
                                </Setter.Value>
                            </Setter>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </DataGrid.CellStyle>
        </DataGrid>

WPF 应用程序启动:

您可以看到,当应用程序启动时,ComboBox 项已正确绑定到 ItemsSource 对象的“ItemCount”字段。应该发生什么(或者至少我想要实现的)是所选项目应该是在 ItemsSource 对象的“位置”字段中定义的项目。

这是正在发生的事情的细分:

我不确定我做错了什么。任何帮助将不胜感激。

Object being added as Itemssource

【问题讨论】:

【参考方案1】:

您需要定义 DisplayMemberPath 和 SelectedItem 绑定。如果您提供了更多代码,我可以准确地向您展示它应该是什么样子。这是我的一些代码中的一个示例...

    <ComboBox ItemsSource="Binding Units" DisplayMemberPath="Symbol" SelectedItem="Binding SelectedToUnit" />

【讨论】:

您好,感谢您的回复。您能否详细说明“DisplayMemberPath”的设置是什么?上面我用一些 PS 代码编辑了我的原始帖子,概述了对象如何应用于 Datagrid。如果您需要更多代码,请告诉我。我很想解决这个问题! 在我的示例中,Symbol 是 DataTable 中列的名称,在我的例子中是 ItemsSource。一切都取决于组合框的 ItemsSource 的组织。我怀疑在您的情况下,这只是一个整数列表,因此您可以将其省略。 是的,我的 itemsource 是一个包含整数 1-10 的列。然后我有第二列包含一个整数,我想成为组合框的选定值。绑定的工作原理是,如果我从组合框中选择一个整数,我的 itemsource 对象会正确更新,但是一旦刷新数据网格,组合框就会返回不显示任何选定项目... datagrid 中组合框的问题在于您有两个 ItemsSource,一个用于表格,一个用于组合框。我怀疑你混淆了这两者。 SelectedItem 是与数据网格的 ItemsSource 中的列的绑定。我认为这就是问题所在。但是你现在已经展示了使用任一 ItemsSource 的组织,所以我不知道。【参考方案2】:

在这里,我使用模板数据网格列创建了一个更完整的示例。

            <DataGridTemplateColumn Header="Declared">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox  SelectedValue="Binding DummyColumn"  DisplayMemberPath="Name" SelectedValuePath="Number" 
                                   ItemsSource="Binding DataContext.DummyCollection, Source=x:Reference dummyElement"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

我需要一个虚拟元素的引用来正确获取数据上下文...

    <FrameworkElement x:Name="dummyElement" Visibility="Collapsed"/>

这里后面的代码是我的数据类和集合

    public class DummyClass
    
        public int Number  get; set; 
        public string Name  get; set; 
    

...

        DummyClassCollection = new ObservableCollection<DummyClass>();

        DummyClassCollection.Add(new DummyClass()  Name = "Item1", Number = 0 );
        DummyClassCollection.Add(new DummyClass()  Name = "Item2", Number = 1 );
        DummyClassCollection.Add(new DummyClass()  Name = "Item3", Number = 2 );

datagrid绑定的数据表...

        DataTable table = new DataTable();
        table.Columns.Add("DummyColumn", typeof(int));
        table.Columns.Add("Bool", typeof(bool));
        table.Rows.Add(1,true);
        table.Rows.Add(2,false);

因此,将此示例与您的示例进行比较,似乎问题在于 SelectedValue 与 SelectedItem。

在不了解绑定数据结构的更多信息的情况下,很难解决您的问题。

【讨论】:

以上是关于WPF Datagrid Combobox SelectedItem 未正确绑定到 Powershell 对象的主要内容,如果未能解决你的问题,请参考以下文章

WPF DataGrid 每行ComboBox 内容不同的设置方法

WPF MVVM 将 ComboBox 绑定到 Datagrid 选定项

WPF中DataGrid的ComboBox的简单绑定方式(绝对简单)

WPF DataGrid ComboBox 导致 InvalidOperationException

WPF DataGrid ComboBox 导致 InvalidOperationException

WPF 使用 id 从数据库表中绑定 DataGrid 列 ComboBox