2016-06-27 3 views
1

Все, что я хочу, это когда пользователь меняет значение в текстовом поле alphaMin_txt, свойство AlphaMin обновляется.привязать текстовое поле к объекту

код позади:

public partial class MainWindow : Window, INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    private string _alphaMin; 

    public string AlphaMin 
    { 
     get { return _alphaMin; } 
     set 
     { 
      if (value != _alphaMin) 
      { 
       _alphaMin = value; 
       NotifyPropertyChanged(); 
      } 
     } 
    } 
} 

XAML:

<DockPanel DataContext="{Binding MainWindow}"> 
    <TextBox Text="{Binding 
         Path=AlphaMin, 
         NotifyOnTargetUpdated=True, 
         Mode=OneWayToSource,  
         UpdateSourceTrigger=PropertyChanged}" /> 
</DockPanel> 

Это должно быть дублировать сто раз, но я прошел через все это, и ни один из них не выложено ясно и просто для этого одностороннего обновления источника. Все учебники MSN привязывают некоторый UIControl к другому, что бессмысленно, потому что IntelliSense показывает вам, как это сделать.

+0

Итак, ваша текущая привязка не работает? Измените это 'NotifyPropertyChanged();' на 'NotifyPropertyChanged (« AlphaMin »);' – AnjumSKhan

+1

Проверьте это предыдущее сообщение SO http://stackoverflow.com/a/23714054/1862333 – failedprogramming

ответ

3

Ваш DockPanel, вероятно, имеет дефектный DataContext связывания. DataContext должен быть установлен на уровне окна.

<Window ... DataContext="{Binding RelativeSource={RelativeSource Self}}" ..> 

Конечно, предполагается, что ваш XAML является MainWindow.xaml.

Если у вас есть другой DataContext для остальной части MainWindow, то вы можете сделать это:

<TextBox Text="{Binding 
     RelativeSource={RelativeSource AncestorType=Window}, 
     Path=AlphaMin, 
     NotifyOnTargetUpdated=True, 
     Mode=OneWayToSource, 
     UpdateSourceTrigger=PropertyChanged}" /> 

Конечно, вы должны удалить DataContext для DockPanel.

Ваш код позади; изменений не требуется. Использование CallerMemberName - хороший способ реализовать INotifyPropertyChanged.

+0

Это сработало. Спасибо! Я закончил тем, что установил его как '' где 'Constants' - это класс, который я использовал вместо MainWindow. Я просто подтолкнул, что это сработало. – AndrewBenjamin

+0

@AndrewBenjamin Если ваш DataContext не является самим окном, тогда проблема должна заключаться в том, что DataContext DockPanel написан неправильно. Это означает, что это не имеет никакого отношения к тому факту, что вы установили DataContext в неправильное место. '', вероятно, тоже сработал. Просто заявляя, если у вас возникло неправильное понимание проблемы, что может привести к тому, что вы будете делать больше ошибок в будущем. – Jai

+0

по тем же строкам ... есть ли параметр, вызывающий обновление 'AlphaMin', когда' myTextbox.Text' установлен программно? Или мне нужно переключиться на TwoWay и программно обновить 'AlphaMin'? – AndrewBenjamin

1
  1. Присвоить имя <Window x:Name="MyWin"...>, а затем изменить DataContext связывание с {Binding ElementName=MyWin}.

  2. Изменить это NotifyPropertyChanged(); к NotifyPropertyChanged("AlphaMin");

+0

Я думаю, что это тоже сработает. Однако мне не нужно указывать '' AlphaMin'', потому что я по умолчанию '[CallerMemberName]'. – AndrewBenjamin

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