2016-08-12 3 views
0

В этом заключается проблема: у меня есть привязка DataGrid к объекту. Я инициализирую этот объект 1 элементом, но DataGrid имеет 2 строки. Но когда я смотрю на свой объект, он содержит только одну строку. Это означает, что есть одна строка, не связанная с моим объектом, но она появляется на моем DataGrid.DataGrid: одна строка появляется без причины

Контекст: Пользователь может выбрать элемент в Combobox с именем Criteria, и он будет сохранен в коллекции UserCriteria. Он может добавлять строки, нажимая на кнопку. UserCriteria содержит индекс строки, поэтому он может удалить любой критерий. Но этот «странный ряд» не имеет индекса, поэтому, если он удалит эту строку, программа выйдет из строя.

Я не хочу показывать код с кнопками добавления и т. Д. ... потому что это не часть проблемы, я уверен.

Я думаю, что есть проблема, когда я подключаю этот вид Search к моим MainView. Я использую 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 (иметь SearchView в MainView):

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>(); 
    } 

Если у кого-то уже есть эта проблема, мне будет приятно помочь мне!

имеют хороший день

ответ

2

Вы должны установить CanUserAddRows="false" наряду с определением DataGrid. Это поможет вам предотвратить создание дополнительной строки в нижней части сетки. Определение сетки будет следующим:

<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". Этот флаг является истинным по умолчанию, поэтому, если вы хотите избежать этого поведения, вы должны установить этот флаг в значение false. –

Смежные вопросы