WPF DataGrid не может добавить строку, когда источник данных пуст
CanUserAddRows="True"
работает только тогда, когда в ItemsSource
из DataGrid
, Если так получилось, что в исходном списке элементов нет строк, то DataGrid
не отображает placeholder
строка для ввода новых предметов, хотя я установил CanUserAddRows="True"
, Зачем?!
Заранее спасибо, Trindaz
2 ответа
Кажется, это известная проблема с WPF DataGrid. Смотрите обсуждение здесь (начиная с 4-го комментария). Также, похоже, это исправлено в.net 4. Я провел несколько тестов для этой проблемы на платформах 3.5 и 4 (бета2). Пожалуйста, смотрите результаты ниже:
Сначала я определил 3 типа коллекций предметов:
public class TestGridItems0 : ArrayList
{
}
public class TestGridItems1 : List<TestGridItem>
{
}
public class TestGridItems2<T> : List<TestGridItem>
{
}
где TestGridItem ниже:
public class TestGridItem
{
public string One { get; set; }
public string Two { get; set; }
public string Three { get; set; }
}
.net 3.5
TestGridItems0 и TestGridItems1 не отображали пустую строку для пустой коллекции; где как TestGridItems2 работал нормально.
.net 4
только TestGridItems0 не показывал строку для пустой коллекции; другие 2 работали нормально.
XAML для сетки:
<my:DataGrid Name="dataGrid" AutoGenerateColumns="False" CanUserAddRows="True">
<my:DataGrid.Columns>
<my:DataGridTextColumn Binding="{Binding One}" Header="One" />
<my:DataGridTextColumn Binding="{Binding Two}" Header="Two" />
<my:DataGridTextColumn Binding="{Binding Three}" Header="Three" />
</my:DataGrid.Columns>
</my:DataGrid>
ниже показано, как был назначен источник предметов:
dataGrid.ItemsSource = new TestGridItems0();
dataGrid.ItemsSource = new TestGridItems1();
dataGrid.ItemsSource = new TestGridItems2<TestGridItem>();
надеюсь, что это помогает, привет
Добавьте пустой элемент в ваш ItemsSource, а затем удалите его. Возможно, вам придется установить CanUserAddRows обратно в true после этого. Я читаю это решение здесь: (Сообщения Джарри и Рика Роена)
У меня была эта проблема, когда я установил ItemsSource в DefaultView объекта DataTable, и представление было пустым. Хотя столбцы были определены, поэтому он должен был их получить. Хех.