为啥 TargetNullValue 更新可为空的 Source
Posted
技术标签:
【中文标题】为啥 TargetNullValue 更新可为空的 Source【英文标题】:Why does TargetNullValue update nullable Source为什么 TargetNullValue 更新可为空的 Source 【发布时间】:2016-07-23 23:21:32 【问题描述】:TargetNullValue
应该在绑定 Source
评估为 null
时更新绑定 Target
:
获取或设置当源值为空时在目标中使用的值。
除此之外,当Target
的值等于给定的TargetNullValue
时,它似乎还将Source
设置为null
(如果可能)。换句话说,它有效地在null
和TargetNullValue
属性的值之间建立了等价关系。但是,文档中根本没有提到这一点。
看这个例子:
<Window x:Class="WPF_Sandbox.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WPF_Sandbox"
Title="MainWindow"
x:Name="ThisControl">
<StackPanel x:Name="MainStackPanel">
<TextBox x:Name="MyTextBox" Text="Binding NullableInt, ElementName=ThisControl, TargetNullValue='', UpdateSourceTrigger=PropertyChanged" />
</StackPanel>
</Window>
public partial class MainWindow : Window
private int? nullableInt;
public int? NullableInt
get return nullableInt;
set nullableInt = value;
public MainWindow()
InitializeComponent();
注意:UpdateSourcetrigger
只是为了让测试更容易而设置的,与有问题的效果无关。
如果您在NullableInt
的设置器中放置断点,您可以看到当您将TextBox
内容更改为''
时,它会被触发(使用value == null
)。
这是TargetNullValue
未记录的行为,还是这里有其他副作用?
编辑: 我偶然发现了这个话题,因为我在看这个问题:Set value to null in WPF binding
【问题讨论】:
【参考方案1】:这似乎是无证行为。如果您在检索要使用的值时查看BindingExpressionBase.GetRawProposedValue(),它实际上会检查该值是否等于 TargetNullValue,如果是,则改用null
:
internal virtual object GetRawProposedValue()
object value = Value;
// TargetNullValue is the UI representation of a "null" value. Use null internally.
if (Object.Equals(value, EffectiveTargetNullValue))
value = null;
return value;
(其中EffectiveTargetNullValue
最终是TargetNullValue
)。
确实,如果您将 TargetNullValue
设置为 5
而不是空字符串,您会看到输入 5
会将属性重置为 null。
【讨论】:
以上是关于为啥 TargetNullValue 更新可为空的 Source的主要内容,如果未能解决你的问题,请参考以下文章
为啥 C# 中的 async/await 会返回可为空的值,即使被告知不要这样做?
为啥条件运算符不能正确地允许使用“null”来分配给可为空的类型? [复制]
将可为空的 DateTime 字段更新为 null 会导致默认 DateTime 值 (0001-01-01 00:00:00.0000000)
为啥可以为空的 rowversion 列在语义上等同于 varbinary(8)?