我从绑定到x:Bind重写了我的UWP应用程序。我在不同的文本框上有一个TextChanged事件。使用Binding我可以使用GetBindingExpression来更新Model。是否有一个等效的方法x:Bind?或者我怎么能用x:绑定?
public void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
var binding = ((TextBox)sender).GetBindingExpression(TextBox.TextProperty);
binding.UpdateSource();
}
答案 0 :(得分:1)
我尝试过这样做但没有成功。我认为暂时不可用,因为绑定它只是一个标记扩展。 以下是如何使用它的文档和示例 https://msdn.microsoft.com/en-us/library/windows/apps/mt204783.aspx
答案 1 :(得分:1)
FrameworkElement.GetBindingExpression
方法返回BindingExpression
,其中包含有关Binding的单个实例的信息。
所以这只能在Binding中使用。根据您发布的代码,似乎您希望使用x:Bind在文本更改时更新源代码。在Binding中,我们可以将UpdateSourceTrigger
设置为PropertyChanged
来执行此操作:
<TextBox Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="200" Margin="5" />
但是x:Bind没有UpdateSourceTrigger
属性,它只会在失去焦点时触发。所以我建议你继续使用Binding。
答案 2 :(得分:0)
编译绑定x:Bind
是在设计时执行的指令,用于生成代码以注册事件处理程序并显式设置相关属性,从而绕过{Binding}
注册,从而在运行时使用反射,因此在运行时由于没有任何方法,因此无法从x:Bind
检测或获取绑定语句的句柄。
正如@Jayden部分解释的那样,在您的特定情况下根本不需要获取绑定,因为在更改文本时不必手动/明确调用绑定上的更新这样反而很直观,并会导致意外的结果。
通过传统的 TwoWay Text
或已编译的TextBox的{{1}}属性{Binding}
的正确方法> TwoWay {x:Bind}
是通过设置UpdateSourceTrigger=PropertyChanged
。
在UWP中,
{Binding}
和{X:Bind}
都支持 UpdatteSourceTrigger ,但是{X:Bind}
的选项较为简单,但选项有限,但是都可以这样做支持PropertyChanged
以下两项均可使用:
<TextBox Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Width="200"
Margin="5" />
<TextBox Text="{x:Bind VM.Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Width="200"
Margin="5" />
只有在绑定语句将UpdateSourceTrigger
设置为Explicit
时,您才会手动更新绑定。
您不应该尝试手动更新绑定的原因是因为它会与绑定语句冲突,特别是如果将绑定故意设置为
UpdateSourceTrigger=LostFocus
时。在这种情况下,您的事件处理程序仍将更新文本更改的绑定,当或将来如果这对开发人员而言成为问题时,他们将不考虑寻找对文本更改事件的显式处理
在迁移到已编译绑定x:Bind
的过程中,并确认它们可用于任何绑定,因此您应仔细检查代码中对GetBindingExpression()
的所有调用,并尝试消除它们因为GetBindingExpression()
不再是确定DependencyProperty
是否已配置或在运行时获取DependencyProperty
的绑定语句的可靠机制。
我知道一个标准控件(NumberBox
)无法正确支持UpdateSourceTrigger=PropertyChanged
,但是由于您无法确定是否已编译绑定已用于绑定属性,需要使用其他解决方案来影响我们期望的更改,see this post for solutions to NumberBox