单选按钮不会在 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 -> 同样,单击单选按钮时不会触发列的编辑模式

因此,这至少将其范围缩小到:单击包含RadioButtonDataGridTemplateColumn 时如何触发编辑模式,就像双击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 新行中生成对象的主要内容,如果未能解决你的问题,请参考以下文章

禁用单选按钮组

为啥单选按钮列表总是占据一个新行?

DataGrid 创建 RadioButton 列

WPF dataGrid 单选按钮

datagridview怎样添加单选控件

在dojo内通过编程方式在网格中添加单选按钮