Проблемы с флажком DataGrid в WPF Toolkit - PullRequest
2 голосов
/ 17 августа 2010

Я действительно надеюсь, что кто-нибудь может помочь мне здесь.У меня есть DataGrid в моей программе, который имеет столбец флажок.ItemsSource для DataGrid - это DataSet, загружаемый программно.Когда я выбираю пару элементов в DataGrid, а затем прокручиваю их, я получаю очень странное поведение.Например, когда я проверяю два из CheckBox, это говорит мне, что у меня выбрано «2 выбрано», но затем, если я прокручиваю вверх или вниз в DataGrid, число меняется.Если я вернусь к исходной позиции, то вернусь к «2 выбранным».Как бы странно это ни звучало, кажется, что при прокрутке окна он вызывает события Checked / Unchecked ... очень странно ...

В верхней части моего кода определено следующее:

private DataSet MyDataSet;
int selected_count = 0;

Затем в моем методе есть следующий код для загрузки информации в DataSet:

MyDataSet = new DataSet();
DataTable tempDataTable = new DataTable();
MyDataSet.Tables.Add(tempDataTable);

DataColumn tempCol = new DataColumn("Checked", typeof(bool));
tempDataTable.Columns.Add(tempCol);

for (int i = 0; i < 50; i++)
{
    DataRow tempRow = tempDataTable.NewRow();
    tempDataTable.Rows.Add(tempRow);
    tempRow["Checked"] = false;
}

MyList.ItemsSource = MyDataSet.Tables[0].DefaultView;

У меня есть свойство IsChecked, привязанное к DataColumn с именем «Checked» с использованием следующего XAML:

<dtgrd:DataGrid x:Name="MyList" AutoGenerateColumns="False" CanUserAddRows="False" CanUserResizeRows="False" HeadersVisibility="Column" SelectionUnit="FullRow" HorizontalGridLinesBrush="#FF688CAF" VerticalGridLinesBrush="#FF688CAF">
    <dtgrd:DataGrid.Columns>
        <dtgrd:DataGridTemplateColumn x:Name="CheckCol" CanUserSort="True" CanUserResize="False">
            <dtgrd:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <CheckBox Name="MyCheckBox" IsChecked="{Binding Checked}" HorizontalAlignment="Center" VerticalAlignment="Center" Checked="MyCheckBox_Checked" Unchecked="MyCheckBox_Unchecked" />
                </DataTemplate>
            </dtgrd:DataGridTemplateColumn.CellTemplate>
        </dtgrd:DataGridTemplateColumn>
    </dtgrd:DataGrid.Columns>
</dtgrd:DataGrid>

Затем у меня есть следующие события, которые вызываются путем установки / снятия одного из флажков:

private void MyCheckBox_Checked(object sender, RoutedEventArgs e)
{
    selected_count++;
    TxtSelectedCount.Text = "" + selected_count + " selected";
}

private void MyCheckBox_Unchecked(object sender, RoutedEventArgs e)
{
    selected_count--;
    TxtSelectedCount.Text = "" + selected_count + " selected";
}

Я также пробовал другие вещи, но получаю разные ошибки.Например, я удалил привязку из кода XAML и попытался установить ее программно, используя следующие события Checked / Uncheck:

private void MyCheckBox_Checked(object sender, RoutedEventArgs e)
{
    DataRow tempRow = MyDataSet.Tables[0].Rows[MyList.Items.IndexOf(MyList.SelectedItems[0])];
    tempRow["Checked"] = true;

    selected_count++;
    TxtSelectedCount.Text = "" + selected_count + " selected";
}

private void MyCheckBox_Unchecked(object sender, RoutedEventArgs e)
{
    DataRow tempRow = MyDataSet.Tables[0].Rows[MyList.Items.IndexOf(MyList.SelectedItems[0])];
    tempRow["Checked"] = false;

    selected_count--;
    TxtSelectedCount.Text = "" + selected_count + " selected";
}

Когда я использую этот код, количество проверенных элементов остается неизменным, нофактические проверки перемещаются по разным предметам, пока я прокручиваю.

Честно говоря, я понятия не имею, что происходит, но это очень расстраивает!Любая помощь будет принята с благодарностью!

1 Ответ

7 голосов
/ 17 августа 2010

Вы перерабатываете контейнер для предметов.См. http://blogs.msdn.com/b/vinsibal/archive/2008/05/14/recycling-that-item-container.aspx. WPF повторно использует объекты строк при прокрутке, и вы видите, что события Checked и Unchecked срабатывают, когда он связывается с другой строкой.

Если вы хотите придерживаться своего текущего решения, вы можете просто отключить переработку контейнера предметов, добавив VirtualizingStackPanel.VirtualizationMode="Standard" к элементу dtgrd:DataGrid.Вы также можете полностью отключить виртуализацию, добавив VirtualizingStackPanel.IsVirtualizing="False".

Лучше было бы получить эти данные из базовой модели данных, а не полагаться на события пользовательского интерфейса.Попробуйте обработать событие DataTable.ColumnChanged в DataTable.

...