2011-04-26 2 views
0

Datagager와 함께 Datagrid/Dataform 설정이 있습니다. 내 DataPager.PageSize는 선언적으로 10으로 설정됩니다. 세 개의 컨트롤 모두에 대한 My ItemsSource는 QueryableCollectionView로 설정됩니다. 내 컬렉션의 레코드 수가 10 개 미만인 경우 컬렉션에 새 항목을 추가해도 아무런 문제가 없습니다. 내 DataForm (새 항목)에서 + 기호를 클릭하고, 양식을 채우고, DP에서 edit_ended 이벤트를 캡처하고, 문제없이 내 SQL DB에 저장합니다."요소가 이미 다른 요소의 자식입니다."컬렉션에 추가 할 때 오류가 발생했습니다.

그러나 10 개 이상의 항목이 있고 + 기호 (새 항목)를 클릭하면 "요소가 이미 다른 요소의 하위 요소입니다."오류가 발생합니다. 두 컨트롤 (Gridview 또는 DataPager) 중 어떤 것이이 문제의 원인인지 잘 모르겠습니다. 또한이를 해결하는 방법을 모르겠습니다.

코드 (XAML) :

<toolkit:DataForm x:Name="dataForm" 
    Width="{Binding Width, ElementName=GV1}" 
    CurrentItem="{Binding SelectedWOEquipment}" 
    ItemsSource="{Binding WOEquipmentItems}" 
    AutoEdit="False" 
    Tag="Equipment" 
Header="Add/Update Equipment" 
    AutoCommit="False" 
    Margin="0,0,0,10" > 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="EditEnded"> 
      <cmd:EventToCommand Command="{Binding SaveEquipmentCommand}" PassEventArgsToCommand="True"/> 
     </i:EventTrigger> 
     <i:EventTrigger EventName="DeletingItem"> 
      <cmd:EventToCommand Command="{Binding DeleteCommand}" 
       CommandParameter="{Binding Tag, ElementName=dataForm}"/> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
    <toolkit:DataForm.ReadOnlyTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <toolkit:DataField> 
        <TextBox Text="{Binding EquipmentCode}" /> 
       </toolkit:DataField> 
       <toolkit:DataField Label="Equipment Description"> 
        <TextBox Text="{Binding EquipmentDescription}" /> 
       </toolkit:DataField> 
       <toolkit:DataField Label="Hours"> 
        <TextBox IsEnabled="False" Text="{Binding Hours}" /> 
       </toolkit:DataField> 
      </StackPanel> 
     </DataTemplate> 
    </toolkit:DataForm.ReadOnlyTemplate> 
    <toolkit:DataForm.EditTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <toolkit:DataField Label="Equipment Codes"> 
        <TextBox Text="{Binding EquipmentCode}" /> 
       </toolkit:DataField> 
       <toolkit:DataField Label="Equipment Description"> 
        <TextBox IsEnabled="False" 
      Text="{Binding EquipmentDescription}" /> 
       </toolkit:DataField> 
       <toolkit:DataField Label="Hours"> 
        <TextBox Text="{Binding Hours, Mode=TwoWay}" /> 
       </toolkit:DataField> 
      </StackPanel> 
     </DataTemplate> 
    </toolkit:DataForm.EditTemplate> 
    <toolkit:DataForm.NewItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <toolkit:DataField Label="Equipment Codes"> 
        <telerik:RadComboBox x:Name="cboEquipment" 
      ItemsSource="{Binding DataSource.EquipmentList, Source={StaticResource DataContextProxy}}" 
         SelectedValue="{Binding EquipmentCode, Mode=TwoWay}" 
         Margin="0 0 20 0">          
         <telerik:RadComboBox.ItemsPanel> 
          <ItemsPanelTemplate> 
           <VirtualizingStackPanel/> 
          </ItemsPanelTemplate> 
         </telerik:RadComboBox.ItemsPanel> 
        </telerik:RadComboBox> 
       </toolkit:DataField> 
       <toolkit:DataField Visibility="Collapsed"> 
        <TextBox Text="{Binding EquipmentDescription,Mode=TwoWay}" /> 
       </toolkit:DataField> 
       <toolkit:DataField Label="Hours"> 
        <TextBox Text="{Binding Hours,Mode=TwoWay}" /> 
       </toolkit:DataField> 
      </StackPanel> 
     </DataTemplate> 
    </toolkit:DataForm.NewItemTemplate> 
</toolkit:DataForm> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 
    <telerik:RadGridView ItemsSource="{Binding WOEquipmentItems}" 
     x:Name="GV1" 
     ShowGroupPanel="False" 
     DataLoadMode="Asynchronous" 
     HorizontalAlignment="Left" 
     HeaderRowStyle="{StaticResource CSAgvHeaderRowStyle}" 
     SelectedItem="{Binding SelectedWOEquipment, Mode=TwoWay}" 
     AutoGenerateColumns="False" 
     IsReadOnly="True"> 
      <telerik:RadGridView.Columns> 
       <telerik:GridViewDataColumn DataMemberBinding="{Binding EquipmentCode}" HeaderCellStyle="{StaticResource CSAgvHeaderCellStyle}" Header="Equipment ID" Width="100"/> 
       <telerik:GridViewDataColumn DataMemberBinding="{Binding EquipmentDescription}" HeaderCellStyle="{StaticResource CSAgvHeaderCellStyle}" Header="Description" Width="300"/> 
       <telerik:GridViewDataColumn DataMemberBinding="{Binding Hours}" HeaderCellStyle="{StaticResource CSAgvHeaderCellStyle}" Header="Hours" Width="75"/> 
      </telerik:RadGridView.Columns> 
      <i:Interaction.Triggers> 
       <i:EventTrigger EventName="SelectedCellsChanged"> 
        <cmd:EventToCommand Command="{Binding EditEquipmentCommand}"/> 
       </i:EventTrigger> 
       </i:Interaction.Triggers> 
      </telerik:RadGridView> 
      <sdk:DataPager Grid.Row="1" Source="{Binding WOEquipmentItems}" PageSize="10" /> 

코드 (뷰 모델) - WOEquipmentItems 제대로 웹 서비스를 통해 인구 :

private QueryableCollectionView _WOEquipmentItems; 
private TSMVVM.Model.WOEquipment _selectedWOEquipment = new TSMVVM.Model.WOEquipment(); 
public QueryableCollectionView WOEquipmentItems 
    { 
     get { return _WOEquipmentItems; } 
     set 
     { 
      _WOEquipmentItems = value; 
      RaisePropertyChanged("WOEquipmentItems"); 
     } 
    } 
public TSMVVM.Model.WOEquipment SelectedWOEquipment 
    { 
     get 
     { 
      if (_selectedWOEquipment != null) 
      { 
       if (_selectedWOEquipment.EquipmentDescription == null && _selectedWOEquipment.EquipmentCode != null) 
       { 
        _selectedWOEquipment.EquipmentDescription = ""; 
        _selectedWOEquipment.EquipmentDescription = EquipmentDescriptionList[EquipmentList.IndexOf(_selectedWOEquipment.EquipmentCode)]; 
       } 
      } 
      return _selectedWOEquipment; 
     } 
     set 
     { 
      _selectedWOEquipment = value; 
      RaisePropertyChanged("SelectedWOEquipment"); 
     } 
    } 
+0

이 게시물을보고 적어도 소스를 추적하는 데 도움이되는지 확인하십시오. http://whydoidoit.com/2010/08/30/debug-xaml-element-is-already-the-child-of-another-element/ –

+0

감사합니다. 닛산. 나는 (아마 가지고 있어야하는) 나의 지위에 그것을 추가 할 수 있었다. 이미 XAMLValidator를 통해이 코드를 실행했지만 실패하지는 않습니다. :(그래도 고마워. –

답변

0

솔루션 엄청나게 단순하게 밝혀졌다. 나는 이것을 추가했다. 내 ViewModel에서이 명령을 등록하여 MyQuerableCollection.MoveToLastPage()을 단순히 실행 한 "AddingNewItem"함수를 실행했다. 이로 인해 내 표 & 호출기가 마지막 페이지로 이동하게되어 선택된 항목이 오류를 던지지 않는 &으로 표시됩니다.

편집 내용 - 내 컬렉션이 정확히 10 일 때 오류가 발생했습니다. 그래서 ItemCount % 10 == 0인지 확인하는 검사를 포함 시켰습니다. 그렇다면 목록에서 첫 번째 항목을 제거했습니다 (Equipment.RemoveAt [0]). 새 항목을 설정 한 후 LoadData() 함수를 실행 했으므로 문제가되지 않았습니다.

관련 문제