2016-05-11 2 views
0

Я немного потерял, я пытаюсь привязать метку в моем графическом интерфейсе к строке в моем коде, но она работает только, если я поместил код в мой блок MainWindow(), и я не могу его обновить нигде.Связывание данных, похоже, работает в MainWindow() WPF

Это мой INotifyPropertyChanged класс:

 public class MyClass : INotifyPropertyChanged 
    { 
     private string _testLabel; 

     protected void OnPropertyChanged(PropertyChangedEventArgs e) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) 
       handler(this, e); 
     } 

     protected void OnPropertyChanged(string propertyName) 
     { 
      OnPropertyChanged(new PropertyChangedEventArgs(propertyName)); 
     } 

     public string testLabel 
     { 
      get { return _testLabel; } 
      set 
      { 
       if (value != _testLabel) 
       { 
        _testLabel = value; 
        OnPropertyChanged("testLabelChanged"); 
       } 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
    } 

Это MainWindow() блок:

 public MainWindow() 
    { 
     InitializeComponent(); 
     testLabelName.DataContext = t; 
     t.testLabel = "Hello World 32432"; 
    } 

Я также объявил это вне:

MyClass t = new MyClass(); 

Это является фрагмент из моего XAML:

<Label Name="testLabelName" Content="{Binding Path=testLabel, Mode=OneWay}" Height="28" Margin="0,0,12,29" VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="128" /> 

Я попытался проверить его, используя событие кнопки, чтобы установить метку, она, кажется, установлена, но никаких изменений в графическом интерфейсе нет. Я думаю, что GUI не обновляется в событии PropertyChanged. Это правильно?

Спасибо,

ответ

2

Я думаю, что есть небольшая проблема с вашим кодом. Когда вы запускаете событие PropertyChanged, вам нужно указать имя свойства. You код недвижимости должен выглядеть следующим образом:

public string testLabel 
    { 
     get { return _testLabel; } 
     set 
     { 
      if (value != _testLabel) 
      { 
       _testLabel = value; 
       OnPropertyChanged("testLabel"); // not testLabelChanged 
      } 
     } 
    } 

Если вы не указали правильное имя свойства, UWP не имеет возможности узнать, какое имущество фактически изменилось, и, таким образом, не обновляет интерфейс.

+0

Вы, сэр, изумительны. Спасибо! –

+0

Простейшим способом избежать опечаток в будущем было бы просто использовать функцию OnPropertyChanged (nameof (testLabel)) 'C# 6. – ghord

0

Пожалуйста, изменяющие:

OnPropertyChanged("testLabelChanged"); 

к:

OnPropertyChanged("testLabel"); 
Смежные вопросы