2016-08-12 31 views
0

這就是問題所在:我有一個DataGrid綁定在一個對象上。我用1個元素初始化這個對象,但DataGrid有2行。但是當我看着我的對象時,他只包含一行。這意味着有一行沒有連接到我的對象,但它出現在我的DataGridDataGrid:一行無緣無故地出現

上下文是:用戶可以選擇名爲Criteria的Combobox中的項目,它將被保存在Collection UserCriteria中。他可以通過點擊按鈕添加行。 UserCriteria包含該行的索引,因此他可以刪除任何標準。但這個「奇怪的行」沒有索引,所以如果他刪除了這一行,程序就會崩潰。

我選擇不顯示添加按鈕等代碼......因爲它不是問題的一部分,我敢肯定。

我認爲在將此視圖Search連接到我的MainView時出現問題。我正在使用MVVMLight Toolkit,但我不確定如何連接兩者。

我搜索查看(只是構造函數):

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

我搜索查看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的搜索查看):

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」時數據網格的默認工作方式。這個標誌默認是true,所以如果你想避免這種行爲,你應該把這個標誌設置爲false。 –

相關問題