Вам необходимо позаботиться о двух шагах. (1) Добавьте вновь выбранные значения и (2) удалите невыделенные значения. Вам понадобится такой метод в вашем классе LookupTable.
public void SynchronizeDataTables(IEnumerable<DataTable> dataTables)
{
// get the current data tables. call ToList() to force and enumeration.
// without the ToList(), you'll get a "Sequence Changed during Enumeration"
// error
var currentDataTables = MapTable.Select(m => m.DataTable).ToList();
// if the table is selected, but not in the data store add it.
foreach (var dataTable in dataTables)
{
if (!currentDataTables.Contains(dataTable))
{
MapTables.Add(new MapTable { DataTable = dataTable });
}
}
// if the table is in the data store, but not selected, then remove it.
foreach (var dataTable in currentDataTables)
{
if (!dataTables.Contains(dataTable))
{
MapTables.Remove(dataTable);
}
}
}
Edit: Когда я сделал это, я был с помощью LINQ к SQL, и я ездил на велосипеде через только выбранных идентификаторов, а не всего объекта. Это сложнее, потому что LINQ-to-Entities создает несколько разные объекты, чем LINQ-to-SQL, потому что он не предоставляет идентификатор FK. Ниже приведены незначительные изменения:
public void SynchronizeDataTables(IEnumerable<int> dataTableIds)
{
// get the current data tables. call ToList() to force and enumeration.
// without the ToList(), you'll get a "Sequence Changed during Enumeration"
// error
var currentDataTableIds = MapTable.Select(m => m.DataTable.Id).ToList();
// if the table is selected, but not in the data store add it.
foreach (var dataTableId in dataTableIds)
{
if (!currentDataTableIds.Contains(dataTableId))
{
var dataTable = ???; // some method to fetch data table with ID = dataTableId
MapTables.Add(new MapTable { DataTable = dataTable });
}
}
// if the table is in the data store, but not selected, then remove it.
foreach (var dataTable in currentDataTableIds)
{
if (!dataTableIds.Contains(dataTableId))
{
var dataTable = ???; // some method to fetch data table with ID = dataTableId
MapTables.Remove(dataTable);
}
}
}
Ваши теги и вопрос говорят L2E, но ваш заголовок говорит L2S. Эти два совершенно разные! –
Вы правы - это L2E. Название обновлено. – chris