gpt4 book ai didi

c# - 当 DataContext 更改时,WPF 绑定(bind) OneWayToSource 将源属性设置为 ""

转载 作者:行者123 更新时间:2023-12-02 02:12:40 26 4
gpt4 key购买 nike

当我设置目标控件的 DataContext 时,我有一个 OneWayToSource 绑定(bind),其行为不符合我的预期。源的属性被设置为默认值,而不是目标控件的属性值。

我在标准 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 以空 DataContext 开始,因此预计绑定(bind)不会执行任何操作。因此,如果我在文本框中键入某些内容(例如“X”),ViewModel.Text 属性将保持为 null。

如果我随后单击Set DataContext按钮,我会期望将ViewModel.Text属性设置为TextBox.Text的“X” 属性。相反,它被设置为“”。当然,绑定(bind)是有效的,因为如果我在文本框中输入“Y”,在“X”之后,它会将 ViewModel.Text 属性设置为“XY”。

这是一个输出示例(由于计算顺序,最后两行是违反直觉的,但它们肯定都在键入“Y”后立即发生):

TextBox changed to X
'Set DataContext' button clicked
ViewModel.Text (old value=<null>, new value=)
ViewModel.Text (old value=, new value=XY)
TextBox changed to XY

为什么在设置 DataContext 时将 ViewModel.Text 属性设置为“”而不是“X”?

我做错了什么?我错过了什么吗?我是否对绑定(bind)有什么误解?

编辑:我预计输出是:

TextBox changed to X
'Set DataContext' button clicked
ViewModel.Text (old value=<null>, new value=X)
ViewModel.Text (old value=X, new value=XY)
TextBox changed to XY

最佳答案

这是一个错误,也可能不是。微软声称这是设计使然。您首先输入 x,然后通过单击 Button 杀死 DataContext,这就是为什么 TextBox 包含 x 并且您的 viewModel.Text 属性被重新初始化(其为空)。当数据上下文改变时,getter 仍然会被调用。最终你没有机会解决这个问题。

但是,您可以使用两种方式并顺其自然。

关于c# - 当 DataContext 更改时,WPF 绑定(bind) OneWayToSource 将源属性设置为 "",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24398199/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com