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;
}
上面的代码是工作感谢所有的反馈
正如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
绑定在它上面。