我有一个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;
}
以上代码正在运行感谢所有反馈
答案 0 :(得分:1)
正如MSDN关于填充下拉列表的DataGridComboBoxColumn的文章所述,您必须首先使用以下选项之一为ComboBox设置ItemsSource属性:
如果要将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
。