2015-05-08 39 views
1

我有這個實體(BaseModel實現INotifyPropertyChanged):綁定到導航屬性不會刷新UI

編輯1:的SetProperty代碼:

protected bool SetProperty<T>(ref T storage, T value, [CallerMemberName] String propertyName = null) 
{ 
    if (object.Equals(storage, value)) return false; 
     storage = value; 

    this.OnPropertyChanged(propertyName); 
    return true; 
} 


public partial class Movimientos : BaseModel 
{ 
    public Movimientos() 
    { 
    } 
    private Nullable<int> _intIdBodega; 
    public Nullable<int> IntIdBodega 
    { 
     get { return _intIdBodega; } 
     set { SetProperty(ref _intIdBodega, value); } 
    } 

    public virtual INV_Bodegas INV_Bodegas { get; set; } 

} 

有了這個導航屬性:

/// Nav property 
public partial class INV_Bodegas : BaseModel 
{ 
    public INV_Bodegas() 
    { 
    }  
    private int _intIdBodega; 
    public int IntIdBodega 
    { 
     get { return _intIdBodega; } 
     set { SetProperty(ref _intIdBodega, value); } 
    } 

    private string _strCodigoBodega; 
    public string StrCodigoBodega 
    { 
     get { return _strCodigoBodega; } 
     set { SetProperty(ref _strCodigoBodega, value); } 
    } 
} 

如果用戶更改IntIdBodega屬性在查看模型

public class VieModel 
{ 
    ObservableCollection<Movimientos> mov {get;set;} 

    public VieModel() 
    { 
     mov = new ObservableCollection<Movimientos>(); 
     mov.CollecTionChanged += mov_CollectionChanged; 
    } 

    void mov_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
    { 
     if (e.NewItems != null) 
     { 

      foreach (var item in e.NewItems) 
      { 
       ((Movimientos)item).PropertyChanged += det_PropertyChanged; 
      } 
     } 
    } 

在視圖模型中,我更新導航屬性,但Datagrid從不更新綁定到此屬性的值。

public void det_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) 
    { 
     Movimientos Idet = (Movimientos)sender; 
     // Here I Update The navigation property. 
     // But DataGrid never refresh the changes 
     if (e.PorpertyName == "IntIdBodega") 
     { 
      Idet.INV_Bodegas = db.INV_Bodegas 
       .Where(x=> x.IntIdbodega == Idet.Intidbodega) 
       .FirstOrDefault(); 
     } 
    } 
} 

這就是我如何綁定。

<DataGridTextColumn Header="{x:Static resources:Labels.Bodega}" 
           Width="0.5*" 
           Binding="{Binding Inv_Bodegas.StrCodigoBodega,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" 
           IsReadOnly="True"> 

我的問題是,這列從未刷新如果我IsReadOnly爲false變化,這些變化可反映只有當我在此列按F2。

我的問題是:

如何強制用戶界面刷新此導航屬性?

回答

1

您已經實現了該接口,但從未提出該事件。嘗試:

public string StrCodigoBodega 
{ 
    get { return _strCodigoBodega; } 
    set { 
     SetProperty(ref _strCodigoBodega, value); 
     this.PropertyChanged(this, new PropertyChangedEventArgs("StrCodigoBodega")); 
    } 
} 

見例如:

https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.propertychanged%28v=vs.100%29.aspx

+0

真。我仍然不明白,爲什麼需要在C#中手動完成「高級」語言。 – Flaudre

+0

Tks爲您提供幫助。但是我的導航屬性永遠不會更改此代碼。唯一改變的是主要實體中的nav屬性本身。我的模型中至少有400個實體,您的解決方案使我能夠在每個導航屬性上完成這項工作......非常大的工作。 –