SL4 | DomainDataSource / DataGrid | Добавление пустой строки для вставки новых элементов - PullRequest
1 голос
/ 18 декабря 2010

Я пытаюсь связать DataForm и DataGrid с DomainDataSource и реализовать функции добавления, удаления и редактирования элементов.

Все отлично работает для части DataForm. Но как я могу добавить новую запись, используя DataGrid? Как я знаю до сих пор, есть два рабочих варианта:

  1. Добавьте новый - «пустой» - элемент в DataView.

    • Проблема: я получаю ошибки валидации в результате ключевых требований и ограничений.
  2. Использование функции SDK для включения возможностей добавления новой строки в элемент управления DataGrid из выпуска службы Silverlight 4 (сентябрь 2010 г.)

    • Проблема: что именно изменилось? Нет новых членов или документации.

Вот несколько основных объявлений разметки, соответствующих самым важным частям моего проекта:

<Grid x:Name="LayoutRoot">
    <sdk:DataGrid x:Name="ParentGrid" AutoGenerateColumns="False" ItemsSource="{Binding ElementName=parentDomainDataSource, Path=Data}"/>
    <toolkit:DataForm x:Name="ParentForm" CommandButtonsVisibility="All" Grid.Row="1" ItemsSource="{Binding ElementName=parentDomainDataSource, Path=Data}"/>

    <sdk:DataGrid x:Name="ChildGrid" Grid.Column="1" AutoGenerateColumns="False" ItemsSource="{Binding ElementName=childDomainDataSource, Path=Data}"/>
    <toolkit:DataForm x:Name="ChildForm" CommandButtonsVisibility="All" ItemsSource="{Binding ElementName=childDomainDataSource, Path=Data}"/>

    <riaControls:DomainDataSource AutoLoad="True" d:DesignData="{d:DesignInstance my1:Child, CreateList=true}" Name="childDomainDataSource" QueryName="GetChildrenQuery"
                                  DomainContext="{StaticResource domainCtx}"/>
    </riaControls:DomainDataSource>
    <riaControls:DomainDataSource AutoLoad="True" d:DesignData="{d:DesignInstance my1:Parent, CreateList=true}" Name="parentDomainDataSource" QueryName="GetParentsQuery" 
                                  DomainContext="{StaticResource domainCtx}"/>
</Grid>

К сожалению, у меня заканчивается время.

Заранее спасибо за любую помощь. С наилучшими пожеланиями из Германии. Надеюсь, что кто-нибудь может помочь;)

Ответы [ 2 ]

0 голосов
/ 07 января 2012

Хотя это не дает точного ответа на ваш вопрос, использование PagedCollectionView работает довольно хорошо.Кроме того, вы можете нажать клавишу Esc, чтобы отменить вставляемую строку.

Недостатком является то, что вам нужно немного вести бухгалтерский учет.

private DomainService1 ctx = new DomainService1();
private PagedCollectionView pcvPersons = null;
private List<Person> tmpList = null;

private void LoadData()
{
    ctx.Load(ctx.GetPersonsQuery(),
        (op) =>
        {
            tmpList = new List<Person>(ctx.Persons);
            pcvPersons = new PagedCollectionView(tmpList);
            dataGrid1.ItemsSource = pcvPersons;
        }, null);
}

private void AddButton_Click(object sender, RoutedEventArgs e)
{
    Web.Person newItem = pcvPersons.AddNew();
}
0 голосов
/ 08 марта 2011

Я только что натолкнулся на этот вопрос, пытаясь выяснить подобное. Размещать здесь в надежде, что это сэкономит кому-то время:

В коде для "Новой записи" Button's Click:

private void OnNewRecordClick(object sender, System.Windows.RoutedEventArgs e)
{ childDomainDataSource.DataView.Add(new Child()); }

DataGrid мгновенно подхватывает новую запись, и вы все равно можете сделать SubmitChangesCommand для DDS, чтобы отправить новую запись обратно в БД.

...