2014-09-01 3 views
1

를 업데이트하지 않습니다 바인딩 내 DataGrid입니다 :WPF DataGrid에 여기

<DataGrid x:Name="MoonMining" 
      ItemsSource="{Binding MarketData.MoonMinerals, ElementName=window}"> 
    <DataGrid.DataContext> 
     <local:MoonMineral/> 
    </DataGrid.DataContext> 
    <DataGrid.Columns> 
     .. Yes i have columns and they are irrelevant to my question . 
    </DataGrid.Columns> 
</DataGrid> 

MarketData 내 프로그램 로직의 대부분을 포함하는 클래스입니다.

public class MarketData 
{ 
    private ObservableCollection<MoonMineral> _moonMinerals = new ObservableCollection<MoonMineral>(); 

    public ObservableCollection<MoonMineral> MoonMinerals 
    { 
     get { return _moonMinerals; } 
     set { _moonMinerals = value; } 
    } 
} 

을 그리고 여기 내 MoonMineral 클래스의 : MoonMinerals은 해당 클래스에 정의되어

[NotifyPropertyChanged] 
public class MoonMineral 
{ 
    public MoonMineral() 
     : this("Def", "Def") 
    { 
    } 

    public MoonMineral(string name, string rarity) 
    { 
     Name = name; 
     Rarity = rarity; 
    } 

    public string Name { get; set; } 
    public double Price { get; set; } 
    public double Volume { get; set; } 
    public string Rarity { get; set; } 
    public double TransportVolume { get; set; } 
    public double TransportCosts { get; set; } 
    public double GrossProfit { get; set; } 
    public double NetProfit { get; set; } 
} 

당신이 볼 수 있듯이, 내 코드를 취소 PostSharp를 사용하고 있지만 수동으로 INotifyPropertyChanged I를 구현할 때 같은 문제가있다.

지금 문제가 내 DataGrid 자체적으로 업데이트되지 않는다는 것입니다, 내가 수동으로 MoonMinerals 수정하는 방법이 전화를해야 :이 거래의 큰 아니라는 것을 알고

var bindingExpression = MoonMining.GetBindingExpression(ItemsControl.ItemsSourceProperty); 
if (bindingExpression != null) 
    bindingExpression.UpdateTarget(); 

을하지만, 마침내 xaml을 사용하여 데이터를 ui에 완전히 바인딩하려고했습니다. 이전의 모든 시도는 데이터를 업데이트 할 때마다 DataGridsItemsSource 속성을 설정하는 것과 관련이 있습니다.

+0

'MoonMinerals' 속성을 변경하고'Yes '인 경우'MoonMineral' 속성과 같은 'PropertyChanged' 이벤트를 발생 시키시겠습니까? – dkozl

+0

MarketData가 .. 의 위치를 ​​이해할 수 없습니다. 그리고 아이템 원본을 ElementName = window에 바인딩하는 이유는 무엇입니까? –

+0

@dkozl 저에게 PostSharp를 사용하고 있습니다. 그렇지만 수동으로 또한 시도했지만 작동하지 않았습니다. – Krzaku

답변

1

MoonMineral 클래스는 INotifyPropertyChanged 인터페이스를 구현하고 의견을 요약하고, 컬렉션에 변경을 처리 할 ObservableCollection를 사용하지만 MoonMinerals 속성에 변경 내용을 처리 할 수있는 장소에 아무것도 것 같다하려면

private ObservableCollection<MoonMineral> _moonMinerals = new ObservableCollection<MoonMineral>(); 

public ObservableCollection<MoonMineral> MoonMinerals 
{ 
    get { return _moonMinerals; } 
    set { _moonMinerals = value; } 
} 

당신이 할 수있는 MoonMinerals 속성을 노출하는 클래스에서 INotifyPropertyChanged 인터페이스를 구현하거나 읽기 전용으로 변경하고 _moonMinerals의 인스턴스를 하나만 사용하고 간단히 지우고 항목을 추가/제거하십시오.

MoonMineral의 새로운 인스턴스에 DataGridDataContext을 설정하므로

또한, 보조 노트, 당신은

<DataGrid.DataContext> 
    <local:MoonMineral/> 
</DataGrid.DataContext> 

필요하지 않습니다. 귀하의 경우에는 ElementName을 사용하여 ItemsSource이라는 바인딩 컨텍스트를 변경하므로 DataContext이 사용되지 않습니다.

+0

로 롤백 할 수 있습니다. 'MoonMinerals'을 노출 한 클래스에서'INotifyPropertyChanged'를 구현했습니다. DataContext가 설정되지 않은 경우 열의 하나에 Setter 값을 바인드 할 때 "심볼을 처리 할 수 ​​없습니다"라는 알림이 표시됩니다. 'Setter'는 그 통보에도 여전히 작동하기 때문에 나는 무엇이 일어나고 있는지 확신 할 수 없다. – Krzaku