将文本框绑定到属性

本文关键字:属性 绑定 文本 | 更新日期: 2023-09-27 17:52:17

我想要的是当用户改变文本框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告诉你如何做到这一点。

将文本框绑定到属性

您的DockPanel可能有错误的DataContext绑定。DataContext应该在窗口级别设置。

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

当然,这是假设你的XAML是MainWindow.xaml.

如果你对主窗口的其余部分有不同的DataContext,那么你可以这样做:

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

当然,你应该删除DockPanel的DataContext。

后面的代码是正确的;不需要任何更改。使用CallerMemberName是实现INotifyPropertyChanged的好方法。

  1. <Window x:Name="MyWin"...>指定一个名称,然后将DataContext绑定为{Binding ElementName=MyWin}

  2. NotifyPropertyChanged();更改为NotifyPropertyChanged("AlphaMin");