DataGridComboBoxColumn值来自自定义类

本文关键字:自定义 DataGridComboBoxColumn | 更新日期: 2023-09-27 18:18:25

我有一个CommentsData类,它用于加载、操作和保存DataGrid中的值。我想使状态字段在类中显示为网格中的下拉列表。注释值只需要填充一次。我尝试了很多变化,但这不起作用。组合是空白的。我需要能够填充组合中的值,当选择改变时,值应该保持在那里,而不是消失。

下面是Grid (Updated 2)的Xaml

<DataGrid Grid.Row="2" AutoGenerateColumns="False"  Height="Auto" HorizontalAlignment="Stretch" Name="grdComments" VerticalAlignment="Stretch" CanUserAddRows="True" CanUserDeleteRows="True" BeginningEdit="grdComments_BeginningEdit" InitializingNewItem="grdComments_InitializingNewItem" PreviewKeyDown="grdComments_PreviewKeyDown" SizeChanged="grdComments_SizeChanged">
  <DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding Path=Author}" Header="Author" />
    <DataGridTemplateColumn Header="Status" >
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <ComboBox  ItemsSource="{Binding UserValues}" DisplayMemberPath="UserStatus" SelectedValuePath="UserStatus" SelectedValue="{Binding Status, UpdateSourceTrigger=PropertyChanged}" />
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
    <DataGridTextColumn Binding="{Binding Path=Comment}" Header="Comment" Width="570" />
  </DataGrid.Columns>

下面是CommentData类(Updated 2)的代码

public class CommentsData 
{
    public string Author { get; set; }
    public string Status { get; set; }
    public string Comment { get; set; }
    public string Username { get; set; }
    public ObservableCollection<StatusValue> UserValues { get; set; }
    public CommentsData()
    {
        UserValues = new ObservableCollection<StatusValue>();
        UserValues.Add(new StatusValue("New"));
        UserValues.Add(new StatusValue("Open"));
        UserValues.Add(new StatusValue("ReOpen"));
        UserValues.Add(new StatusValue("Closed"));
    }
}
public class StatusValue
{
    public string UserStatus { get; set; }
    public StatusValue (string value)
    {
        UserStatus = value;
    }
}

下面是初始化注释列表的代码

private List<CommentsData> _commentsList;
private void InitializeObjects()
{
        _commentsList = new List<CommentsData>();
        grdComments.ItemsSource = _commentsList;
}

上面的代码是工作感谢所有的反馈

DataGridComboBoxColumn值来自自定义类

正如MSDN关于DataGridComboBoxColumn填充下拉列表的文章所述,您必须首先通过使用以下选项之一设置组合框的ItemsSource属性:

    静态资源。
  • 一个x:静态代码实体。
  • ComboBoxItem类型的内联集合。

如果您想将ComboBox.ItemsSource绑定到对象属性,那么像这样使用DataGridTemplateColumn更容易:

<DataGridTemplateColumn Header="Status">
     <DataGridTemplateColumn.CellTemplate>
         <DataTemplate>
              <ComboBox ItemsSource="{Binding UserValues}" DisplayMemberPath="UserStatus" SelectedValuePath="UserStatus" SelectedValue="{Binding Status, UpdateSourceTrigger=PropertyChanged}" />
         </DataTemplate>
     </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

我看到你的代码中缺少一些东西

首先,你的类没有实现INotifyPropertyChanged。这意味着,如果一个属性在CommentData上改变了,它不会告诉UI它已经改变了,所以UI不会更新来显示新的值。

第二,你告诉你的ComboBox在每个项目上都有一个名为Status的属性,并将其用作ComboBoxItem.Value,然而这个属性在StatusValue上不存在。将其更改为引用UserStatus,这是StatusValue的有效属性。

SelectedValuePath="UserStatus"

最后,你真的不应该在每个项目上重新创建ComboBox项目。相反,在ViewModel层次结构中更上层的某个地方创建集合,或者使其成为静态资源。

例如,如果包含CommentsData集合的类也包含StatusValues集合,则可以使用RelativeSource绑定像这样绑定到它:

ItemsSource="{Binding 
    RelativeSource={RelativeSource AncestorType={x:Type DataGrid}},
    Path=DataContext.UserValues}"

这是我将使用代替您的DataGridComboboxColumn:

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ComboBox ItemsSource="{Binding UserValues}" SelectedItem="{Binding Status}" DisplayMemberPath="UserStatus" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

另外,CommentsData.Status的类型应该是StatusValue,而不是string,这样你就可以将SelectedItem绑定在它上面。