0

我有一个 CommentsData 类,它用于在 DataGrid 中加载、操作和保存值。我想让类中的状态字段显示为网格中的下拉列表。注释值只需填充一次。我尝试了很多变化,但这不起作用。组合是空白的。I need to be able to populate the values in the combo and when the selection changes the value should remain there and not dissappear.

这是网格的 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;

}

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

4

3 回答 3

1

正如 MSDN 关于DataGridComboBoxColumn以填充下拉列表的文章中所述,您必须首先使用以下选项之一设置 ComboBox 的 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>
于 2011-12-21T13:44:19.173 回答
1

我发现您的代码中缺少一些东西

首先,您的课程没有实现INotifyPropertyChanged。这意味着,如果属性更改 on 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}"
于 2011-12-21T15:09:43.563 回答
0

这是我将使用的 DataGridComboboxColumn:

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

CommentsData.Status应该是 type StatusValue, not string,这样可以绑定SelectedItem就可以了。

于 2011-12-21T13:44:35.360 回答