2016-09-29 11 views
1

モデルのObservableCollection(従業員)を持つ選択されたツリービューアイテムがあり、アイテム/従業員がツリーから選択されたとき、 id(textblock)、name(textblock)、プロモーションの詳細(「PromotionHistory」と呼ばれる別のモデルの観測可能なコレクションであるDataGrid)などの詳細を表示し、詳細を正しく表示します。ボタン(「UpdateLocation」)の際観察可能なコレクション項目の変更を伴うモデルが更新されないモデルWPFのDataGridビューMVVM

<TreeView x:Name="EmployeesDataTree" ItemsSource="{Binding Employees}"/> 
    <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding ElementName=EmployeesDataTree, Path=SelectedItem.EmployeePromotionDetails}"> 
      <DataGrid.Columns> 
      <DataGridTextColumn Header="Employee Promotion Id" Binding="{Binding Name}" /> 
      <DataGridTextColumn Header="Employee NewTitle" Binding="{Binding NewTitle}" /> 
      <DataGridTextColumn Header="Employee Location " Binding="{Binding Location}" /> 
      .... 
     </DataGrid.Columns> 
    </DataGrid> 

私はコードを私のviewmodelにPromotionHistoryのDataGrid内の場所名のセルの値を変更したときにクリック私のObservableCollection項目の詳細が成功してきたが、変更が戻ってUIに反映されていません更新しました。

foreach (var item in (SelectedEmployeeItem as EmployeeModel).EmployeePromotionDetails) 
{ 
    // condition which hits service and verify if the location name is  up to date by searching with id and updates. 
    if(condition) 
    { 
     item.Name = "New Location"; 
    } 
} 

は、このサイト上でいくつかの研究の後、私は私の問題は、それ自体のObservableCollection(このような項目を追加/削除など)は変更されませんでしたが、そのコレクションINSIDE項目だけであることがわかりました。しかし、私は、ui/viewを変更して更新することができませんでした。

+2

項目は、INotifyPropertyChangedを実装する必要があります。あなたの研究はその事実を立証したはずです。当然のことながら、 'item.Name'のセッターコードを共有する考えはありません(これは結局のところです)。しかし、' PropertyChanged'は発生しませんよね?これを間違える方法はほとんどありません。それはほとんどすべてです。 –

+0

[ObservableCollectionの可能な複製] WPFバインディングの表示が更新されていません。(http://stackoverflow.com/questions/14404495/observablecollectiont-wpf-binding-display-not-updating) –

+0

ビューを表示するように 'Mode = TwoWay'を追加してみてくださいソースが変更されたときに更新される可能性があります。例えば。 'Binding =" {Binding Name、Mode = TwoWay} "' NewTitle'と 'Location'と同じです。 –

答えて

1

あなたitemは、あなたのクラスには、次を実装する必要がクラスPromotionHistoryのタイプである場合:

public class PromotionHistory : INotifyPropertyChanged 
{ 
    private string _name; 

    public string Name { 
     get { return _name; } 
     set { 
      _name = value; 
      OnPropertyChanged(); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    [NotifyPropertyChangedInvocator] 
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

PropertyChangedイベントがあなたのUIを更新しています。 ObservableCollectionは、変更された項目プロパティから独立しているCollectionChangedイベントを介して項目を追加または削除する場合にのみ影響します。

0

各アイテムはINotifyPropertyChangedを実装していますか?そうでなければあなたの問題です。 ObservableCollectionに変更が通知される必要があり、INotifyPropertyChangedインターフェイスがこれを行います。

関連する問題