2016-01-07 80 views
1

我剛剛嘗試從MVVM開始,經過多年的使用代碼。當百分比完成更改時,我試圖讓ThisClaimValue更新。 ThisClaimValue旨在顯示基於PercentageComplete的ContractAmt的百分比。無論是人們投入價值,還是離開細胞。我試圖用零代碼來做到這一點,所以沒有內置事件。MVVM中的Datagrid綁定和編輯

我使用EF Database First作爲Description,ContractAmt和BillCurrentAmt。 PercentageComplete和ThisClaimValue作爲EF創建的類的部分類位於單獨的解決方案中。

查看:

<DataGrid Margin="10,10,10,0" RowDetailsVisibilityMode="VisibleWhenSelected" EnableRowVirtualization="True" AutoGenerateColumns="False" ItemsSource="{Binding JCCISelectedList, UpdateSourceTrigger=PropertyChanged}" SelectedValue="{Binding JCCI}" Grid.Row="3"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding Description}" Header="Description" Width="Auto" IsReadOnly="True"/> 
      <DataGridTextColumn Binding="{Binding ContractAmt}" Header="Value" Width="Auto" IsReadOnly="True"/> 
      <DataGridTextColumn Binding="{Binding PercentageComplete, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Header="% Complete" Width="Auto"/> 
      <DataGridTextColumn Binding="{Binding BillCurrentAmt, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Header="$ Complete" Width="Auto"/> 
      <DataGridTextColumn Binding="{Binding ThisClaimValue}" Header="This Claim Value" Width="Auto" IsReadOnly="True"/> 
     </DataGrid.Columns> 
    </DataGrid> 

視圖模型:

public class JBProgressBillItemsViewModel : INotifyPropertyChanged, IPageViewModel 
    { 
     public AcceptCommand AcceptEvent { get; set; } 
     public BackCommand BackEvent { get; set; } 
     public string Name => "JBProgressBillItems"; 

     public JBProgressBillItemsViewModel() 
     { 
      HQCOList = Facade.GetVistaHQCO(); 
      AcceptEvent = new AcceptCommand(this); 
      BackEvent = new BackCommand(this); 
     } 
     private bHQCO _hqco; 
     private bJCCM _jccm; 
     private bJCCI _jcciSection; 
     private bJCCI _jcci; 

     public ObservableCollection<bHQCO> HQCOList { get; } 
     public ObservableCollection<bJCCM> JCCMList { get; private set; } 
     public ObservableCollection<bJCCI> JCCISectionList { get; private set; } 
     public ObservableCollection<bJCCI> JCCIList { get; private set; } 
     public ObservableCollection<bJCCI> JCCISelectedList { get; private set; } 

     public bHQCO HQCO 
     { 
      get { return _hqco; } 
      set 
      { 
       _hqco = value; 
       JCCMList = Facade.GetVistaActiveProjects(_hqco.HQCo); 
       RaisePropertyChanged(nameof(HQCO)); 
       RaisePropertyChanged(nameof(JCCMList)); 
      } 
     } 

     public bJCCM JCCM 
     { 
      get { return _jccm; } 
      set 
      { 
       _jccm = value; 
       JCCIList = Facade.GetVistaContractItems(_hqco.HQCo, _jccm.Contract); 
       JCCISectionList = 
        new ObservableCollection<bJCCI>(JCCIList.Where(x => x.SICode == "H" || x.SICode == "SH")); 
       RaisePropertyChanged(nameof(JCCM)); 
       RaisePropertyChanged(nameof(JCCISectionList)); 
      } 
     } 

     public bJCCI JCCISection 
     { 
      get { return _jcciSection; } 
      set 
      { 
       _jcciSection = value; 
       try 
       { 
        JCCISelectedList = new ObservableCollection<bJCCI>(JCCIList.Where(x => _jcciSection.BillGroup == x.BillGroup && string.IsNullOrWhiteSpace(x.SICode))); 
       } 
       catch (ArgumentNullException) 
       { 
       } 
       RaisePropertyChanged(nameof(JCCISection)); 
       RaisePropertyChanged(nameof(JCCISelectedList)); 
      } 
     } 

     public bJCCI JCCI 
     { 
      get { return _jcci; } 
      set 
      { 
       _jcci = value; 
       _jcci.ThisClaimValue = value.PercentageComplete * value.ContractAmt/100; 
       RaisePropertyChanged(nameof(JCCI)); 
       RaisePropertyChanged(nameof(JCCISelectedList)); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
     private void RaisePropertyChanged(string propertyName) 
     { 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
     } 

     public string Error => null; 

    } 

編輯:添加完整的視圖模型上面的代碼。

+0

是什麼bJCCI JCCI?請詳細說明。我的意思是這是一個模型對象? –

+0

如果您會回覆並澄清您的陳述,那麼只有我們可以幫助您。 –

+0

bJCCI是EF中的表格。 – Phalanx

回答

0

對於它的工作確保JCCISelectedList指定爲ObservableCollection這將解決您的問題。
否則你將需要分別提高屬性更改事件的每個
Description
ContractAmt
....
每個元素作爲raiseproperty改變事件犯規生成元素改變任何情況下爲JCCISelectedList該屬性保持相同的元素時,其改變的datacontext正在改變。

+0

我已經在上面添加了我的完整視圖模型代碼。我把它當成了一個ObservableCollection。我的問題是,數據網格不更新與價值。即使該值保存在內存中。 – Phalanx

+0

看起來像@abhishek回答了你的問題。如果你仍然面臨問題,那麼帶樣本JSON的示例項目將會很棒。 – Jerin

0

因此,bJCCI是EF中的表格,並且您希望ThisClaimValue在PercentageComplete更改時進行更新,其中ThisClaimValue和PercentageComplete是此表中的字段。在這裏你調用RaisePropertyChanged的表對象和集合改變不是特殊的字段值像ThisClaimValue或PercentageComplete改變。

因此,解決辦法是創建一個模型類包裝您的表中的字段與示範類物業這樣

public class Model 
{ 
    private bJCCI _jcci; 
    public Double PerComplete 
    { 
     get { return _jcci.PercentageComplete ; } 
     set 
     { 
      _jcci.PercentageComplete = value; 
      RaisePropertyChanged(nameof(PerComplete)); 
      RaisePropertyChanged(nameof(ClaimValue)); //Model property of ThisThisClaimValue field 
     } 
    } 
} 

現在,這裏的時候PerComplete屬性將被改變,ClaimValue屬性將被更新和通知。 在Xaml中綁定這些Model的屬性,不要直接使用EF模型類。

而且在視圖模型創建

public ObservableCollection<Model> MyCollection { get; set; } 

,並用數據網格項目源結合於此。

請參閱此鏈接; WPF MVVM INotifyPropertyChanged Implementation - Model or ViewModel

希望這會給一個想法:)

+0

這是爲你工作嗎? –