2013-09-16 4 views
0

저는 WPF를 처음 사용했기 때문에 여기서 누락 된 기본적인 내용이있을 수 있습니다.뷰 모델의 속성 변경을 기반으로 UI 업데이트

<Window x:Class="MyApp.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Test Application" Height="647" Width="723" Background="#88B0FF"> 

    <DockPanel Name="MainDock"> 
     <Button DockPanel.Dock="Top" Margin="5,0,5,0" x:Name="PingButton" Click="PingButton_OnClick">Ping</Button> 
     <TextBox Text="{Binding Path=Output}" /> 
    </DockPanel> 
</Window> 

코드 숨김이 같다 :

public partial class MainWindow : Window 
{ 
    private Model _applicationModel = new Model(); 
    public Model ApplicationModel { 
     get { return _applicationModel; } 
     set { _applicationModel = value; } 
    } 

    public MainWindow() 
    { 
     InitializeComponent(); 

     this.DataContext = ApplicationModel; 
     ApplicationModel.Output = "Not clicked"; 
    } 

    private void PingButton_OnClick(object sender, RoutedEventArgs e) 
    { 
     ApplicationModel.Output = "Clicked"; 
    } 
} 

내가에서 INotifyPropertyChanged를 구현하는 작은 클래스라는 모델이 나는이처럼 보이는 응용 프로그램이 있습니다.

public class Model : INotifyPropertyChanged 
{ 

    public string Output { get; set; } 

    public event PropertyChangedEventHandler PropertyChanged; 

    [NotifyPropertyChangedInvocator] 
    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

이 응용 프로그램을 실행하면 텍스트 상자에 "클릭하지 않음"이라는 텍스트가 표시됩니다. 버튼을 클릭하면 텍스트가 변경 될 것으로 예상됩니다. 그렇지 않습니다. "ApplicationModel"개체가 업데이트되고 이는 DataContext에 반영됩니다. 그러나 OnPropertyChanged() 메서드에 중단 점이 있지만 호출 된 적이없는 것으로 보입니다.

내가 뭘 잘못하고 있니?

답변

4

OnPropertyChanged()은 호출하지 않기 때문에 이 호출되지 않습니다. OnPropertyChanged에 전화를 걸 때 특별한 마법이 없으므로 직접해야합니다.

구체적으로는 변경 될 때 당신은 그것을 호출하여 Output 속성을 수정해야한다 (그리고 그것은 당신의 ApplicationModel 속성에 대해 동일한 기능을 수행 할 해치지 않을 것입니다 :

private string output; 
public string Output 
{ 
    get { return output; } 
    set 
    { 
     if (output != value) 
     { 
      output = value; 
      OnPropertyChanged("Output"); 
     } 
    } 
} 

당신이 .NET 4.5을 타겟팅하는 경우 .

private string output; 
public string Output 
{ 
    get { return output; } 
    set { SetProperty(ref output, value); } 
} 

당신이 .NET 4.0 이하를 사용하는 경우, 당신이 표현 트레를 사용할 수 있습니다; 상투적 인 코드를 줄이기 위해 CallerMemberName attribute을 이용할 수 This article 그렇게하는 방법을 설명합니다 그럼 당신은 이런 식으로 뭔가를해야합니다 (in this answer).

+0

바하마, 여기 반사 마술이 필요했습니다. 여기서 상용구를 줄이는 모범 사례는 무엇입니까? –

+0

@KeithRipley 업데이트 된 답변보기 –

+0

나는 그것이 분명히 나를 위해 작동한다는 것을 알았다. :-) –

관련 문제