2016-08-12 4 views
0

이것은 문제입니다. 개체에 DataGrid 바인딩이 있습니다. 이 개체를 1 요소로 초기화하지만 DataGrid에는 2 개의 행이 있습니다. 그러나 내 물건을 볼 때, 그는 단지 하나의 줄만 가지고 있습니다. 즉, 내 객체에 연결되지 않은 행이 하나 있는데 그 행이 내 DataGrid에 표시됩니다.DataGrid : 아무 이유없이 한 행이 표시됩니다.

컨텍스트는 다음과 같습니다. 사용자는 Combobox에서 Criteria이라는 항목을 선택할 수 있으며 컬렉션 UserCriteria에 저장됩니다. 버튼을 클릭하여 행을 추가 할 수 있습니다. UserCriteria에는 행의 색인이 들어 있으므로 모든 기준을 삭제할 수 있습니다. 그러나이 "이상한 행"에는 색인이 없기 때문에이 행을 삭제하면 프로그램이 중단됩니다.

버튼을 추가하여 코드를 표시하지 않기로 결정했습니다. 문제의 일부가 아니기 때문에 선택해야합니다.

SearchMainView에 연결할 때 문제가 있다고 생각합니다. MVVMLight Toolkit을 사용하고 있지만 둘 다 연결하는 방법을 잘 모르겠습니다.

내 SearchView (단지 생성자) :

public SearchView() 
    { 
     DataContext = SearchViewModel; 

     InitializeComponent(); 
    } 

내 SearchViewModel :

public static ObservableCollection<UserCriterion> UserCriteria 
    { 
     get { return _UserCriteria; } 
     set { _UserCriteria = value; } 
    } 

    // CONSTRUCTOR 
    public SearchViewModel() 
    { 
     // This is a list of Criteria 
     Criteria = Criterion.GetCriteriaUsuable(); 
     // In this function, I add one row to my Collection 
     UserCriteria = InitUserCriterionRow(); 
     // To create the DataContext 
     SearchView.SearchViewModel = this; 
    } 

내 SearchView의 XAML :

<Grid> 
     <DataGrid Name="CriteriaDataGrid" ItemsSource="{Binding UserCriteria, Mode=TwoWay}" AutoGenerateColumns="False"> 
      <DataGrid.Columns> 

       <!--COMBOBOX FOR ATTRIBUTES--> 
       <DataGridTemplateColumn Header="Criteria" Width="250" > 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <ComboBox Width="235" SelectedItem="{Binding Path=DataContext.SearchViewModel.LastSelectedCriterion, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Mode=TwoWay}" 
             ItemsSource="{Binding Path=DataContext.SearchViewModel.Criteria, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Mode=TwoWay}" 
             IsEditable="True" DisplayMemberPath="Fullname" 
             HorizontalAlignment="Left"> 
          </ComboBox> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
      </DataGrid.Columns> 
     </DataGrid> 
</Grid> 

내 MainViewModel합니다 (MAINVIEW에서 SearchView를 가지고) :

private ViewModelBase searchViewModel; 
    public ViewModelBase SearchViewModel 
    { 
     get { return searchViewModel; } 
     set 
     { 
      searchViewModel = value; 
      RaisePropertyChanged("SearchViewModel"); 
     } 
    } 

    /// <summary> 
    /// Initializes a new instance of the MainViewModel class. 
    /// </summary> 
    public MainViewModel(IDataService dataService) 
    { 
     _dataService = dataService; 
     _dataService.GetData(
      (item, error) => 
      { 
       if (error != null) 
       { 
        // Report error here 
        return; 
       } 

       WelcomeTitle = item.Title; 
      }); 
     SearchViewModel = SimpleIoc.Default.GetInstance<SearchViewModel>(); 
    } 

누군가 이미이 문제가 발생하면 도움이 될 것입니다.

은 좋은 하루 당신은 데이터 그리드의 정의와 함께 CanUserAddRows="false"을 설정해야

답변

2

에게 되세요. 그리드 하단에서 여분의 행 생성을 방지하는 데 도움이됩니다. 그리드 정의는 다음과 같습니다 :

<DataGrid Name="CriteriaDataGrid" 
      ItemsSource="{Binding UserCriteria, Mode=TwoWay}" 
      AutoGenerateColumns="False" 
      CanUserAddRows="false"> // You need to add this line 
+0

이것은 완벽합니다! 젠장, 정말 고마워! 나는이 주장이'Mode = TwoWay'를 할 수 있다고 생각했다. 이 추가 행이 생성 된 이유를 알고 있습니까? – Destunk

+0

행복하게 기뻐하십시오 –

+0

사용자가 새 행을 추가 할 수 있도록 추가 행이 추가되었습니다. 첫 번째 행에서 타이핑을 시작할 때 알아 차리면 다른 행이 추가됩니다. CanUserAddRows = "true"가 설정된 경우 데이터 그리드가 작동하는 기본 방법입니다. 이 플래그는 기본적으로 true이므로이 동작을 방지하려면이 플래그를 false로 설정해야합니다. –

관련 문제