Я внедрил IEditableObject
для своих ViewModel и элементы управления, привязанные ниже.DataGrid вызывает метод BeginEdit() для запуска дважды
Теперь, когда первый раз я запускаю Window
, содержащий эти элементы управления, выполняется метод BeginEdit()
и создает резервные копии переменных.
Моя проблема заключается в следующем: Когда я начинаю редактирование DataGrid
снова в BeginEdit()
пробегов метод и сохраняет изменения в моих уже зарезервированных переменных! Это разрушает цель BeginEdit()
и CancelEdit()
. Теперь, если я захочу отменить окно, у меня не будет исходных данных. Как я могу это предотвратить?
<ComboBox ItemsSource="{Binding Path=CoatingFactors}"
SelectedItem="{Binding Path=CoatingFactor}">
</ComboBox>
<DataGrid ItemsSource="{Binding Path=CustomCFactors}"
....
</DataGrid>
Вот как я реализовал BeginEdit()
и CancelEdit()
методу:
private List<CustomCFactorItem> customCFactors_ORIGINAL;
private double coatingFactor_ORIGINAL;
public void BeginEdit()
{
customCFactors_ORIGINAL = customCFactors.ConvertAll(o => o.Clone()).ToList();
coatingFactor_ORIGINAL = coatingFactor;
}
public void CancelEdit()
{
customCFactors = customCFactors_ORIGINAL.ConvertAll(o => o.Clone()).ToList();
coatingFactor = coatingFactor_ORIGINAL;
}
UPDATE:
В настоящем время, я использую немного рубить так:
private List<CustomCFactorItem> customCFactors_ORIGINAL;
private double coatingFactor_ORIGINAL;
private int editNum = 0;
public void BeginEdit()
{
if (editNum > 0) return;
editNum++;
customCFactors_ORIGINAL = customCFactors.ConvertAll(o => o.Clone());
coatingFactor_ORIGINAL = coatingFactor;
}
public void EndEdit()
{
editNum = 0;
}
public void CancelEdit()
{
editNum = 0;
customCFactors = customCFactors_ORIGINAL.ConvertAll(o => o.Clone());
coatingFactor = coatingFactor_ORIGINAL;
}
Спасибо Jace, я не добавляю и не удаляю что-либо из своей коллекции, только простое редактирование. Как его реализовать? – Vahid
Я ошибся в синтаксисе, но теперь я обновил код. – Jace
Вы можете найти много руководств в Интернете о 'MVVM' и' INotifyPropertyChanged'. Логика добавления и удаления в этом примере будет применяться к элементам при первой загрузке коллекции. Итак, все, что вам нужно сделать, это привязать объект 'ObservableCollection' и заполнить' ExecuteBackupLogic', чтобы определить, что делать, когда какой-либо элемент в вашей коллекции будет изменен. – Jace