繁体   English   中英

双向绑定WPF

[英]Two-way binding in WPF

我无法在 WPF 中进行双向绑定。

我在我的应用程序的主要 window 中有一个字符串属性绑定到一个文本框(我将模式设置为“TwoWay”)。

TextBox 的值唯一会更新的时间是 window 初始化时。

当我在 TextBox 中键入内容时,底层字符串属性值不会更改。

当字符串属性的值被外部源更改时(例如,Click 上的事件只是重置 TextBox 的值),更改不会向上传播到 TextBox。

即使在这个几乎微不足道的示例中,我必须执行哪些步骤才能使双向绑定正常工作?

很可能你正在尝试绑定到.net CLR属性而不是WPF dependencyProperty(除了其他一些东西之外还提供Change Notification)。
对于普通的CLR属性,您需要在PropertyChanged的事件处理程序中实现INotifyPropertyChanged并强制更新文本框。

  • 因此,使用属性实现此对象的对象,在属性设置器中引发事件。 (现在我们有财产变更通知)
  • 确保将对象设置为UI元素/控件的DataContext属性

当我开始学习WPF数据绑定时,这也让我失望了。

更新: OP,如果我在错误的树上咆哮,那将是浪费时间..反正现在,因为你不得不挖一点......你会记住它很长一段时间。 这是完成此答案的代码片段。 还发现,只要我跳出选项,就会自动更新文本框。如果您的datacontext对象不是实现INotifyPropertyChanged的对象,则只需手动订阅该事件并更新UI。

MyWindow.xaml

<Window x:Class="DataBinding.MyWindow" ...
    Title="MyWindow" Height="300" Width="300">
    <StackPanel x:Name="TopLevelContainer">
        <TextBox x:Name="txtValue"  Background="AliceBlue" Text="{Binding Path=MyDotNetProperty}" />
        <TextBlock TextWrapping="Wrap">We're twin blue boxes bound to the same property.</TextBlock>
        <TextBox x:Name="txtValue2"  Background="AliceBlue" Text="{Binding Path=MyDotNetProperty}" />
    </StackPanel>
</Window>

MyWindow.xaml.cs

public partial class MyWindow : Window, INotifyPropertyChanged
{
    public MyWindow()
    {
        InitializeComponent();
        this.MyDotNetProperty = "Go ahead. Change my value.";
        TopLevelContainer.DataContext = this;
    }

    private string m_sValue;
    public string MyDotNetProperty
    {
        get { return m_sValue; }
        set
        {
            m_sValue = value;
            if (null != this.PropertyChanged)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("MyDotNetProperty"));
            }
        }
    }

    #region INotifyPropertyChanged Members
    public event PropertyChangedEventHandler PropertyChanged;
    #endregion
}

我觉得需要增加一些精度:

“两种方式”数据绑定不仅仅是“单向”数据绑定。

“单向”数据绑定是从源到依赖属性的绑定。 源必须实现INotifyProertyChanged,以便从源到目标获得更改传播。

要获得“2路”,那么要从Target传播到Source,它取决于您在Binding上设置的绑定模式。 如果没有为绑定设置任何BindingMode,则将使用默认的绑定模式,并且此默认模式是目标依赖项属性的特征。

例:

绑定到字符串属性的文本框,名为“MyTextProperty”。 在代码中,将Textbox.Text DependencyProperty绑定到对象“MyObject”上的“MyTextProperty”

- >“单向”绑定:“My TextProperty”的setter必须引发一个Property Changed事件,而“MyObject”必须实现INotifyPropertyChanged。

- >“2种方式数据绑定”:除了“单向”所需的内容之外,bindingMode必须设置为“2种方式”。 在这种特殊情况下,Textbox的Text DependencyProperty确实有“2路”作为默认模式,所以没有别的事可做!

我们可能需要查看代码。 您的字符串属性是否引发了PropertyChanged事件? 或者(甚至更好)它是作为DependencyProperty实现的? 如果不是,绑定的TextBox将不知道值何时更改。

至于键入TextBox并且没有看到属性的值更改,这可能是因为您的TextBox没有失去焦点。 默认情况下,绑定的TextBox不会将其值写回源属性,直到焦点离开控件。 尝试跳出它并查看属性值是否发生变化。

确保绑定指定两种方式,并且当属性发生变化时,它会立即传输到持有属性。

 <TextBox Text="{Binding TextBuffer, 
                         UpdateSourceTrigger=PropertyChanged, 
                         Mode=TwoWay}"/>

上面确保TextBox输入控件的Text属性绑定到,然后以立即、 PropertyChangedTwoWay方式将更改发送回名为TextBuffer的字符串属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM