2013-02-17 2 views
2

다음은 내 모델 ViewModel 및 xaml 바인딩의 예입니다. viewmodel은 INotifyPropertChanged을 구현합니다. 내가 겪고있는 문제는 ... wpf 폼을 처음로드 할 때 ActiveStock을 설정하면 setter와 getter가 모두 호출되고 UI가 데이터를 올바르게 반영하도록 업데이트됩니다.
그러나 나중에 StockViewModel.ActiveStoc k를 설정하면 FirePropertyChanged이 호출되지만 getter가 호출되는 것을 볼 수 없으므로 UI가 새 데이터를 반영하도록 업데이트되지 않습니다. 여기에 무슨 일이 일어날 지 모릅니다.양식이로드 된 후 INotifyPropertyChanged.PropertyChanged가 실행되었지만 UI가 업데이트되지 않습니다.

두 번째 질문은 ViewModel.ActiveStock이 변경되면 내 모델의 하위 속성 (PriceDataCompanyData)에 대해 PropertyChanged을 올릴 필요가 있는지 여부입니다.

public class Stock 
{ 
    public string Ticker { get; set; } 
    public StockData PriceData { get; set; } 
    public StockData CompanyData { get; set; } 
} 
public class StockData 
{ 
    ... 
} 
public class StockViewModel:INotifyPropertyChanged 
{ 
    private Stock _activeStock; 
    public Stock ActiveStock 
    { 
     get{ return _activeStock;} 
     set{ _activeStock = value; FirePropertyChanged("ActiveStock");} 
    } 
    ... 
} 

XAML :

<UserControl Template="{StaticResource StockTemplate}" DataContext="{Binding ActiveStock}" Tag="{Binding PriceData}" /> 
<UserControl Template="{StaticResource StockTemplate}" DataContext="{Binding ActiveStock}" Tag="{Binding CompanyData}" /> 

편집 : 내가 UserControl을위한 바인딩의 DataContext를 제거하고 대신 ActiveStock 변경, 그것은 잘 작동 할 때 뒤에 코드에서이 두 컨트롤에 대한 DataContext를 설정합니다. 왜???

게터는 지금까지의 내가 아무것도 볼 수있는 값을 "점점"이기 때문이라고하지 않을
+0

뷰의 코드 숨김을 표시하여 ViewModel을 바인딩하는 방법과 ActiveStock에서 데이터를 설정하는 방법을 확인할 수 있습니다. – Xcalibur37

+0

1) StockTemplate에 대한 xaml을 보는 것이 도움이됩니다. 2) InitializeComponent() 전후에 View의 DataContext를 설정합니까? –

+1

후 ... FirePropertyChanged 인수에 문제가있는 것으로 판명되었습니다! 이런 ... 나는 InotifyPropertyChanged를 다루는 더 좋은 방법 (반사없이)이 있었으면 좋겠다. – mike01010

답변

2

, 사용되는 전용 속성은 PriceDataCompanyData하고 이러한 INotifyPropertyChanged

당신은 INotifyPropertyChanged를 구현해야합니다 사용하지 않는 Stock 클래스에서 UI에 변경 사항을 반영하십시오.

public class Stock : INotifyPropertyChanged 
{ 
    private string _ticker; 
    private StockData _priceData; 
    private StockData _companyData; 

    public string Ticker 
    { 
     get { return _ticker; } 
     set { _ticker = value; NotifyPropertyChanged("Ticker"); } 
    } 

    public StockData PriceData 
    { 
     get { return _priceData; } 
     set { _priceData = value; NotifyPropertyChanged("PriceData"); } 
    } 


    public StockData CompanyData 
    { 
     get { return _companyData; } 
     set { _companyData = value; NotifyPropertyChanged("CompanyData"); } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged(string property) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(property)); 
     } 
    } 
} 
+0

이러한 클래스에 INotifyPropertyChanged를 구현하면 무언가를 가져올 필요가 있음을 알 수 있도록 uielement가 NotifyPropertyChanged를 실행해야합니다. 그래도 ViewModel 클래스가 이러한 이벤트를 발생시켜야한다는 것을 알 수 있습니다. 자체적으로 우려하는 유일한 자산은 자체 ActiceStock 속성입니다. – mike01010

+0

당신의 대답이 가장 가까웠다 고 생각합니다. 문제는 멤버 속성 (이미하고있는 이벤트)을 실행하는 데 필요한 이벤트가 아니라 FirePropertyChanged args의 오타였습니다. – mike01010

2

datacontext 바인딩에 mode 속성을 지정하려고 할 수 있습니다.

OneTime이 DataContext의 기본 바인딩인지 확실하지 않지만 위의 경우 도움이 될 것이라고 설명합니다.

두 번째 질문은 sa_ddam213이 대답했습니다.

HTH

+0

불행히도이 문제가 해결되지 않습니다 – mike01010

+0

xaml 파일의 datacontext는 무엇입니까? –

+0

형식으로, 나는 public 멤버가 "Public StockViewModel ViewModel {get; set;}" 양식의 생성자에서 StockViewmOdel의 인스턴스를 만들고 할당 한 다음 DataContext = ViewModel을 할당합니다. – mike01010

관련 문제