【发布时间】:2014-08-15 09:33:43
【问题描述】:
我有一个 OneWayToSource 绑定,当我设置目标控件的 DataContext 时,它的行为不符合我的预期。源的属性被设置为默认值,而不是目标控件的属性值。
我在标准 WPF 窗口中创建了一个非常简单的程序来说明我的问题:
XAML
<StackPanel>
<TextBox x:Name="tb"
Text="{Binding Path=Text,Mode=OneWayToSource,UpdateSourceTrigger=PropertyChanged}"
TextChanged="TextBox_TextChanged"/>
<Button Content="Set DataContext" Click="Button1_Click"/>
</StackPanel>
MainWindow.cs
public partial class MainWindow : Window
{
private ViewModel _vm = new ViewModel();
private void Button1_Click(object sender, RoutedEventArgs e)
{
Debug.Print("'Set DataContext' button clicked");
tb.DataContext = _vm;
}
private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
Debug.Print("TextBox changed to " + tb.Text);
}
}
ViewModel.cs
public class ViewModel
{
private string _Text;
public string Text
{
get { return _Text; }
set
{
Debug.Print(
"ViewModel.Text (old value=" + (_Text ?? "<null>") +
", new value=" + (value ?? "<null>") + ")");
_Text = value;
}
}
}
TextBox tb 以 null DataContext 开始,因此绑定不会执行任何操作。因此,如果我在文本框中键入内容,例如“X”,ViewModel.Text 属性将保持为空。
如果我随后单击 Set DataContext 按钮,我会期望将 ViewModel.Text 属性设置为 TextBox.Text 属性的“X”。相反,它被设置为“”。当然绑定是有效的,因为如果我在文本框中输入“Y”,在“X”之后,它会将ViewModel.Text 属性设置为“XY”。
这是一个输出示例(最后两行由于计算顺序而违反直觉,但它们肯定都会在输入“Y”后立即出现):
文本框更改为 X
单击“设置 DataContext”按钮
ViewModel.Text(旧值=,新值=)
ViewModel.Text(旧值=,新值=XY)
文本框更改为 XY
为什么在设置 DataContext 时将ViewModel.Text 属性设置为“”而不是“X”?
我做错了什么?我错过了什么吗?我对绑定有什么误解吗?
编辑:我希望输出是:
文本框更改为 X
单击“设置 DataContext”按钮
ViewModel.Text(旧值=,新值=X)
ViewModel.Text(旧值=X,新值=XY)
文本框更改为 XY
【问题讨论】: