DataGrid:无理由出现一行

时间:2016-08-12 07:29:10

标签: c# wpf mvvm datagrid

这就是问题:我对一个对象绑定DataGrid。我使用1个元素初始化此对象,但DataGrid有2行。但是当我看着我的物体时,他只包含一排。这意味着有一行没有连接到我的对象,但它出现在我的DataGrid上。

上下文是:用户可以在名为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(在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>();
    }

如果有人已经有这个问题,那么帮助我会很高兴!

度过愉快的一天

1 个答案:

答案 0 :(得分:2)

您需要设置CanUserAddRows="false"以及DataGrid的定义。这将帮助您防止在网格底部生成额外的行。网格定义如下:

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