【问题标题】:Radiobutton does not generate object in Datagrid new Row单选按钮不会在 Datagrid 新行中生成对象
【发布时间】: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 { get{if (guid==null){/*create guid*/}return guid;} set{/*set your guid here*/} }
  • 我试图确定,但它没有修复它,因为单击单选按钮不会创建对象,GUID 属性不存在,使用“Snoop”之类的软件向我显示“GUID " 在我触发 DataGridTextColumn 上的另一个编辑(创建对象)之前," 未解决

标签: c# wpf datagrid


【解决方案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 无法测试
猜你喜欢
  • 2011-10-28
  • 1970-01-01
  • 2016-03-08
  • 1970-01-01
  • 2017-06-08
  • 2013-11-27
  • 1970-01-01
  • 1970-01-01
  • 2019-11-20
相关资源
最近更新 更多