2013-09-16 3 views
0

Я новичок в WPF, поэтому, возможно, что-то основное, что мне не хватает здесь. У меня есть приложение, которое выглядит следующим образом:Обновление пользовательского интерфейса на основе изменения свойств в модели вида

<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 вы . можно использовать CallerMemberName attribute уменьшить шаблонный код, This article объясняет, как сделать так, тогда вы будете иметь что-то вроде этого:

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

Если вы используете .NET 4.0 или ниже, вы можете использовать выражение TRE es, как описано in this answer.

+0

Бах, я надеялся на магию отражения здесь. Какие-нибудь рекомендации по сокращению схемы здесь? –

+0

@KeithRipley Посмотри мой обновленный ответ –

+0

Я видел, это определенно работает для меня. :-) –

Смежные вопросы