【问题标题】:Binding when a button is pressed (Explicit binding) has always BindingExpression at null?按下按钮时的绑定(显式绑定)总是 BindingExpression 为空?
【发布时间】:2010-11-18 23:19:24
【问题描述】:

我有一个文本框,其中包含一个必须在用户按下按钮时才绑定的字符串。在 XAML 中:

<Button Command="{Binding Path=PingCommand}" Click="Button_Click">Go</Button>
<TextBox x:Name="txtUrl" Text="{Binding Path=Url,UpdateSourceTrigger=Explicit, Mode=OneWay}" />

在代码隐藏中:

private void Button_Click(object sender, RoutedEventArgs e)
{  
    BindingExpression be = this.txtUrl.GetBindingExpression(TextBox.TextProperty);
    be.UpdateTarget();
}

“be”始终为 NULL。为什么?

更新:

好的,经过多次尝试,这里有一些更新。

如果,我将模式设置为带有显式更新的 OneWay。我在 GetBindingExpression 的“be”对象中有一个 NullReferenceException。

如果,我使用显式更新将模式设置为空(默认为 TwoWay)。我有绑定获取值(string.empty),它每次都会擦除文本框中的所有内容。

如果,我将 Mode 设置为 OneWay,使用 PropertyChanged 当我在文本框中按下键时绑定的属性没有引发任何问题,一旦我单击按钮,我在“be”对象中有一个 NULLReferenceException。

如果,我将 Mode 设置为空(默认 TwoWay),使用 PropertyChanged 我有每次按下时都会引发的属性(GOOD)但我不希望每次用户按下键时都更改属性...但是仅当用户按下按钮时。

【问题讨论】:

  • be 对我来说不为空......
  • 第一次单击按钮时它不为空。这是第二次。我没有明确删除绑定,这就是为什么如果某些行为可以删除我可能不知道的绑定,我会感到困惑。
  • 所以这一次有效?另外,请抓住你的问题,以免它说它“总是”为空。
  • 第一个、第二个、第三个和 ...
  • 我一开始以为一直都是这样,但我尝试了很多东西,似乎第一次就奏效了。但是,现在因为我已经将绑定放回显式第一个,第二个和其他尝试不再起作用。几分钟前“be”为空并崩溃,现在绑定不起作用但“be”不再为空!阿格

标签: c# .net wpf binding


【解决方案1】:

好吧,再想一想,我注意到了:

 BindingExpression be = this.txtUrl.GetBindingExpression(TextBox.TextProperty);
 be.UpdateTarget();

有一些不合逻辑的东西,因为我不想更新目标而是更新源。我只是将 be.Updatetarget() 更改为 be.UpdateSource();并且一切都与这个 XAML 一起工作:

 <TextBox x:Name="txtUrl" Text="{Binding Path=Url, UpdateSourceTrigger=Explicit}">...

感谢所有帮助我解决此问题的人。我给大家加了+1!谢谢

【讨论】:

  • +1,因为有趣的是显式绑定更新允许您动态指定更新的方向。我想在源和目标都更改的双向情况下,一个简单的“更新”会产生未知的结果。好东西要知道。
【解决方案2】:

它应该可以工作,可能您正在调用在事件处理程序中提供的行之前删除绑定的函数?为文本框的 text 属性赋值将删除绑定

【讨论】:

  • 我会检查代码中的某个地方是否分配了值,但我对此表示怀疑,因为它都是绑定驱动的设计。
【解决方案3】:

您是否尝试过不使用 UpdateSourceTrigger 的数据绑定?如果绑定失败,我希望 null 是 GetBindingExpression 的结果。

其中一个原因可能是 Url 未作为 DependencyProperty 实现。

【讨论】:

  • Url 不是 DependencyProperty。应该吗?
  • Binding 的来源不一定是DependencyProperty,它可以是普通属性。只有Binding 的目标必须是DP
  • 我已将绑定更改为 UpdateSourceTrigger=PropertyChanged 并且未指定模式。我看到后面的属性在我每次输入时都会发生变化。现在,我已经放回显式(不更改模式,因此它是默认的 2 方式之一),并且属性没有改变,但每次我点击按钮时文本框都会变为空白......
  • 哦!编辑后的答案,您需要 OneWayToSource 绑定。 OneWay 的行为与您的意图相反。
  • 我可能又错了。我正在阅读的资源让我感到困惑(哪个对象被认为是“来源”),但我相信你之前做得对。在这一点上,问题可以用 this.Url = this.txtUrl.Text 来解决,这似乎有点矫枉过正,但它不能解决为什么会发生这种情况的问题。
猜你喜欢
  • 2014-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
  • 2017-07-30
  • 2011-02-07
  • 2016-07-14
相关资源
最近更新 更多