0

我目前在 C# 应用程序中使用 WPF Datagrid,其中每一行包含一个 CheckBox、一个 ComboBox 和一个 TextBox。然后,为 CheckBox.Checked、CheckBox.Unchecked 和 ComboBox.SelectionChanged 事件注册一个方法。启用扩展选择后,我想将控件的更改反映到所有选定的行(例如,如果未选中复选框,则应针对每个选定的行)。

当使用控件并且一切正常时,该方法会按预期调用。我的问题是当我 scoll DataGrid 时也会调用该事件,这给我带来了一些麻烦。我对此的第一个想法是某些行是虚拟化的,并且在加载它们时会调用该事件,但我不确定如何验证这一点。

我想要的是简单地忽略这些事件,我使用 eventArg 来确定所做的更改并将其反映在选定的单元格上。但是在滚动时,这会导致一些随机行为......

它可以是在加载时调用事件的虚拟行吗?我可以检测到这种行为并忽略这些事件吗?

这是我的 DataGrid 定义:

<DataGrid AutoGenerateColumns="False" Height="364" HorizontalAlignment="Left" Margin="6,40,0,0" Name="dataGrid" VerticalAlignment="Top" Width="628" CanUserResizeColumns="True" SelectionMode="Extended" CanUserResizeRows="False" CanUserReorderColumns="False" CanUserAddRows="False">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Column 1">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <CheckBox Name="dataGrid_checkBox" IsChecked="false" Checked="OnDataGridEvent" Unchecked="OnDataGridEvent" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="Column 2">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox Name="dataGrid_comboBox" SelectionChanged="OnDataGridEvent">
                        <ComboBoxItem Content="1" IsSelected="True" />
                        <ComboBoxItem Content="2" />
                        <ComboBoxItem Content="3" />
                        <ComboBoxItem Content="4" />
                    </ComboBox>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

谢谢你的帮助

4

1 回答 1

2

不要使用 ComboBoxItem
绑定到列表
不要使用 SelectionChanged 事件 - 只需使用集合

struct NameBool
{
    private string name;
    private bool selected;
    public string Name
    {
        get { return name; }
        set
        {
            if (name == value) return;
            name = value;
        }
    }
    public bool Selected
    {
        get { return selected; }
        set
        {
            if (selected == value) return;  // this is to ignore a no change
            selected = value;
        }
    }
    public NameBool(string Name, bool Selected) { name = Name; selected = Selected;}
}
于 2013-05-06T18:55:29.553 回答