单选按钮不会在 Datagrid 新行中生成对象
Posted
技术标签:
【中文标题】单选按钮不会在 Datagrid 新行中生成对象【英文标题】:Radiobutton does not generate object in Datagrid new Row 【发布时间】:2016-06-06 01:46:20 【问题描述】:据我了解,在 Datagrid 中使用“新行”时,它会在设置其属性之一时创建和对象。
这适用于DataGridTextColumn
,当我在其中写入内容时会创建该对象。但我也有一些DataGridTemplateColumn
,每个都包含一个单选按钮。单击它们时,它应该生成对象,因为我正在设置所述对象的属性。
但事实并非如此,正如您在下一个屏幕截图中看到的那样,第一行被命名,然后我单击一个单选按钮,一切都很好
然后在第二行,我只单击单选按钮,它也应该创建一个对象,但事实并非如此,我可以从能够单击相同行的多个 RadioButton 中看出,因为 GroupName 在构造函数
注意: X 是单选按钮(X = 选中,空 = 未选中)
只要我在文本中输入内容,就会构造对象,初始化 GroupName,并将单选按钮设置为其默认值(第一列)
我已经通过记录链接到这些单选按钮的属性的“set”检查了 TwoWay 绑定是否正常工作,并且工作正常。
如何在单击单选按钮时强制构造对象?
编辑:我尝试过的事情:
实现IEditableObject
-> 单击单选按钮不会触发编辑模式
设置 CellEditTemplate -> 同样,单击单选按钮时不会触发列的编辑模式
因此,这至少将其范围缩小到:单击包含RadioButton
的DataGridTemplateColumn
时如何触发编辑模式,就像双击DataGridTextColumn
一样
编辑 2:根据评论的要求,这是我的数据网格的 XAML
<DataGrid ItemsSource="Binding Theme.Competences" AutoGenerateColumns="False" RowHeaderWidth="0"
ColumnWidth="*" IsReadOnly="False" ColumnHeaderStyle="StaticResource FullBorderDataGrid" SelectionUnit="Cell"
CanUserResizeColumns="False" CanUserReorderColumns="False" CanUserSortColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Compétence" Binding="Binding Label" />
<DataGridTextColumn Header="Description" Binding="Binding Description" />
<DataGridTemplateColumn Header="1" Width="10">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<RadioButton GroupName="Binding GUID" IsChecked="Binding Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged,
Converter=l:EnumMatchToBooleanConverter,
ConverterParameter=One"
Style="StaticResource XRadioButton" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="2" Width="10">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<RadioButton GroupName="Binding GUID" IsChecked="Binding Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged,
Converter=l:EnumMatchToBooleanConverter,
ConverterParameter=Two"
Style="StaticResource XRadioButton" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="3" Width="10">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<RadioButton GroupName="Binding GUID" IsChecked="Binding Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged,
Converter=l:EnumMatchToBooleanConverter,
ConverterParameter=Three"
Style="StaticResource XRadioButton" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="4" Width="10">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<RadioButton GroupName="Binding GUID" IsChecked="Binding Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged,
Converter=l:EnumMatchToBooleanConverter,
ConverterParameter=Four"
Style="StaticResource XRadioButton" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="NA" Width="10">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<RadioButton GroupName="Binding GUID" IsChecked="Binding Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged,
Converter=l:EnumMatchToBooleanConverter,
ConverterParameter=NA"
Style="StaticResource XRadioButton" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Commentaire" Binding="Binding Comment" />
</DataGrid.Columns>
</DataGrid>
型号:
[ImplementPropertyChanged]
public class Competence : IEditableObject
public int? Index get; set;
public string Label get; set;
public string Description get; set;
public Value Value get; set; = Value.NA;
public string GUID get; set;
public Competence()
GUID = Guid.NewGuid().ToString();
void IEditableObject.BeginEdit()
Console.WriteLine("Begin edit caught");
void IEditableObject.CancelEdit()
void IEditableObject.EndEdit()
public string Comment get; set;
IEditableObject.BeginEdit 在双击 DataGridTextColumn 时调用,但从不使用 DataGridTemplateColumn
【问题讨论】:
能否请您发布您的 XAML 和 C# 代码,以便我们找到您的问题? 我更新了我的帖子,但我认为这与其中的某些内容无关,而是缺少某些内容 我认为public string GUID get; set;
行会导致错误。改为string guid; public string GUID getif (guid==null)/*create guid*/return guid; set/*set your guid here*/
我试图确定,但它没有修复它,因为单击单选按钮不会创建对象,GUID 属性不存在,使用“Snoop”之类的软件向我显示“GUID " 在我触发 DataGridTextColumn 上的另一个编辑(创建对象)之前," 未解决
【参考方案1】:
将此添加到您的数据网格中:
<DataGrid AddingNewItem="dataGridView_AddingNewItem"....
在代码中:
void dataGridView_AddingNewItem(object sender, System.Windows.Controls.AddingNewItemEventArgs e)
var item = new Competence();
// Change item's values here.
e.NewItem = item;
【讨论】:
虽然这是一个不错的解决方案,但我可能忘记提及我正在使用 MVVM 模式,但我会为任何看到此模式的非 MVVM 用户投票 @LionelPire:这是针对 MVVM 的,在您完成编辑一行后,这个新项目会自动添加到您的视图模型集合中。 MVVM 模式将逻辑与 UI 分开,在您的回答中,您使用的是 ViewModel 中的 UI 元素发送的事件。这使得 ViewModel 无法测试以上是关于单选按钮不会在 Datagrid 新行中生成对象的主要内容,如果未能解决你的问题,请参考以下文章