В этом заключается проблема: у меня есть привязка 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>();
}
Если у кого-то уже есть эта проблема, мне будет приятно помочь мне!
имеют хороший день
Это идеальное решение! Черт, действительно спасибо! Я думал, что этот аргумент должен был «Mode = TwoWay». Вы знаете, почему происходит генерация этой дополнительной строки? – Destunk
Прохладный, чтобы помочь вам –
Добавлена дополнительная строка, которая поможет пользователю добавить новые строки. Если вы заметите, когда начнете вводить первую строку, будет добавлена другая строка. Это метод по умолчанию, когда сетка данных работает, когда установлен CanUserAddRows = "true". Этот флаг является истинным по умолчанию, поэтому, если вы хотите избежать этого поведения, вы должны установить этот флаг в значение false. –