DataGridComboBoxColumn自定义类的值

时间:2011-12-21 13:19:45

标签: c# wpf data-binding datagridcomboboxcolumn

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

这是网格的Xaml(更新2)

<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类的代码(已更新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;

}

以上代码正在运行感谢所有反馈

3 个答案:

答案 0 :(得分:1)

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

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

如果要将ComboBox.ItemsSource绑定到object属性,则更容易使用DataGridTemplateColumn,如下所示:

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

答案 1 :(得分:1)

我看到你的代码遗漏了一些东西

首先,您的课程没有实施INotifyPropertyChanged。这意味着,如果CommentData上的属性发生更改,则不会告知UI已更改,因此UI不会更新以显示新值。

其次,您告诉您的ComboBox每个项目都有一个名为Status的属性,并将其用作ComboBoxItem.Value,但{{1}上不存在此属性}}。更改它以引用StatusValue,这是UserStatus上的有效属性。

StatusValue

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

例如,如果包含您的SelectedValuePath="UserStatus" 集合的类也包含您的CommentsData集合,则可以使用StatusValues绑定绑定到它:

RelativeSource

答案 2 :(得分:0)

以下是我将使用的DataGridComboboxColumn:

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

同样CommentsData.Status的类型应为StatusValue,而不是string,以便您可以绑定SelectedItem