【问题标题】:bind a textbox to a property将文本框绑定到属性
【发布时间】:2016-06-27 04:39:09
【问题描述】:

我想要的只是当用户更改文本框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 向您展示了如何做到这一点。

【问题讨论】:

  • 那么,您当前的绑定不起作用?将此NotifyPropertyChanged(); 更改为NotifyPropertyChanged("AlphaMin");
  • 查看之前的 SO 帖子 stackoverflow.com/a/23714054/1862333

标签: c# wpf binding textbox


【解决方案1】:

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

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

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

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

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

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

你后面的代码是正确的;无需更改。使用CallerMemberName 是实现INotifyPropertyChanged 的好方法。

【讨论】:

  • 这行得通。谢谢!我最终将它设置为&lt;Window.DataContext&gt;&lt;local:Constants/&gt;&lt;/Window.DataContext&gt;,其中Constants 是我使用的类而不是MainWindow。我很高兴它成功了。
  • @AndrewBenjamin 如果你的DataContext不是窗口本身,那么问题应该是DockPanel的DataContext写错了。这意味着它与您将 DataContext 设置在错误的位置这一事实无关。 &lt;DockPanel.DataContext&gt;&lt;local:Constants/&gt;&lt;/DockPanel.DataContext&gt; 可能也会起作用。只是说一下,以防你对问题的理解有错误,这可能会导致你以后犯更多的错误。
  • 同理...当myTextbox.Text 以编程方式设置时,是否有设置导致AlphaMin 更新?还是我应该切换到 TwoWay 并仅以编程方式更新 AlphaMin?
  • @AndrewBenjamin 这不是绑定应该做的吗?
  • 当我执行alphaMin_txt.Text = "1.1" 时,AlphaMin 永远不会更新,直到我再次开始在文本框中输入。如果绑定能解决这个问题就好了。也许这是我的设置之一。
【解决方案2】:
  1. 为 &lt;Window x:Name="MyWin"...&gt; 分配一个名称,然后将 DataContext 绑定更改为 {Binding ElementName=MyWin}。

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

【讨论】:

  • 我认为这也可行。但是我不必指定"AlphaMin",因为我默认为[CallerMemberName]。
猜你喜欢
  • 2016-02-12
  • 2011-01-13
  • 1970-01-01
  • 2023-04-06
  • 2018-11-16
  • 1970-01-01
  • 1970-01-01
  • 2013-03-21
  • 2018-07-02
相关资源
最近更新 更多