2017-08-15 69 views
-1

我有一个Window,其中DataGridCompanies在其中。用户单击“编辑”,将打开一个新的Window,并将SelectedCompany传递给ModifyWindow。现在,这一切都按预期工作,并且如果用户在ModifyWindow上单击SaveSelectedCompany将在sql上更新,而更改将反映在Companies主窗口上的DataGrid中。当用户在MVVM中关闭窗口时防止通过模型更新WPF

但是,如果用户在该ModifyWindow更改Company并没有点击保存,而是使用交叉(我清楚地说,他们要扔掉这个编辑),那么Company仍在更新关闭WindowDataGrid。下面是一些代码:

CompaniesViewModel

private void ShowEditCompanyWindow() 
{ 
    var modifyCompanyViewModel = new ModifyCompanyViewModel(SelectedCompany); 
    modifyCompanyViewModel.ReturnModifiedCompany += LoadModifiedCompany; 
    Messenger.Default.Send(modifyCompanyViewModel); 
} 

private void LoadModifiedCompany(Company modifiedCompany) 
{ 
    var existingCompany = DataGridCompanies.FirstOrDefault(c => c.Id == modifiedCompany.Id); 
    var i = DataGridCompanies.IndexOf(existingCompany); 
    DataGridCompanies[i] = modifiedCompany; 

    var existingSearchCompany = AllSearchCompanies.FirstOrDefault(s => s.Id == modifiedCompany.Id); 
    var x = AllSearchCompanies.IndexOf(existingSearchCompany); 
    if (existingSearchCompany != null) 
    { 
     existingSearchCompany.Name = modifiedCompany.Name; 
     existingSearchCompany.Town = modifiedCompany.Town; 
     AllSearchCompanies[x] = existingSearchCompany; 
    } 

    SelectedCompany = modifiedCompany; 

    SearchCompanyView = CollectionViewSource.GetDefaultView(AllSearchCompanies) as CollectionView; 

    Application.Current.MainWindow.Activate(); 
} 

ModifyCompanyViewModel

private async void ProcessCompany(Window window) 
{ 
    var waitView = new WaitView 
    { 
     Owner = Application.Current.Windows.OfType<Window>().FirstOrDefault(x => x.IsActive) 
    }; 
    waitView.Show(); 

    if (await EditCompany()) 
    { 
     ReturnModifiedCompany(SelectedCompany); 
     CloseWindow(window); 
    } 

    waitView.Close(); 
} 

DataGridCompaniesView

<DataGrid Grid.Row="1" x:Name="CompaniesDataGrid" Margin="5" 
      ItemsSource="{Binding DataGridCompanies}" 
      SelectedItem="{Binding SelectedCompany}"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Name" Width="*" Binding="{Binding Name}"/> 
     <DataGridTextColumn Header="Town" Width="*" Binding="{Binding Town}"/> 
     <DataGridTextColumn Header="Telephone" Width="*" Binding="{Binding Telephone}"/> 
    </DataGrid.Columns> 
</DataGrid> 

我是新来MVVM和我现在在想我不必更新DataGridCompanies中的Company,因为MVVM会为我处理这个问题。尽管我的大问题是SelectedCompany仍然在DataGrid中发生变化,即使它们已关闭修改窗口并且不想提交。我已尝试在修改窗口上绑定关闭事件并存储未修改的公司,并返回,但CompanyDataGrid中仍然更改,无论如何。

+0

你对'ModifyWindow'一个'cancel'按钮?关闭它应该只是做同样的事情。 – Haukinger

+0

@Haukinger我没有取消按钮,我只是使用窗口上的十字形作为取消(或希望)的形式 – CBreeze

回答

0

例如,您可以在您的Company类中实现IEditableObject接口,并在窗口关闭时调用CancelEdit()方法。

BeginEdit()方法应存放“老”的属性值,例如:

string _oldName; 

public void BeginEdit() => _oldName = _name; 

public void CancelEdit() => Name = _oldName; 

public void EndEdit() => _oldName = null; 
+0

我真的必须存储每个可以编辑的值(超过20个值)或我可以只储存公司本身吗?此外,因为我使用实体框架并不意味着每次从数据库生成我都必须经过并在我的所有模型上再次实现该界面? – CBreeze

+0

您将不得不存储每个单独属性值的旧值,但您可能需要查看为您创建浅拷贝的MemberwiseClone()方法:https://stackoverflow.com/questions/2289420/what-is-该法-memberwiseclone-做。客户是一种参考类型。要“修改”EF生成的实体类,您可以在同一个程序集和命名空间中创建一个部分类:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs /局部类和 - 的方法。 – mm8

+0

因此,在开始编辑我可以使用MemberwiseClone(),通过EF保存更改,然后在EndEdit空它?我仍然不确定这是如何打破CompanyWindow和ModifyWindow之间的引用,因为我在ModifyWindow中输入TextBoxes,CompanyWindow中的DataGrid中的值正在更改 – CBreeze