gpt4 book ai didi

c# - OneWayToSource 绑定(bind)在 .NET 4.0 中似乎已损坏

转载 作者:IT王子 更新时间:2023-10-29 04:08:17 25 4
gpt4 key购买 nike

OneWayToSource .NET 4.0 中的绑定(bind)似乎已损坏

我有这个简单的 Xaml

<StackPanel>
<TextBox Text="{Binding TextProperty, Mode=OneWayToSource}"/>
<Button/>
</StackPanel>

我的代码是这样的

public MainWindow()
{
InitializeComponent();
this.DataContext = this;
}
private string m_textProperty;
public string TextProperty
{
get
{
return "Should not be used in OneWayToSource Binding";
}
set
{
m_textProperty = value;
}
}

在 .NET 3.5 中 这可以正常工作,但可能除外。在 TextBox 中放置一些文本,按 Tab 键使其失去焦点,然后 TextProperty 更新为在 TextBox 中输入的任何文本/p>

在 .NET 4.0 中,如果我在 TextBox 中键入一些文本,然后按 Tab 使其失去焦点,TextBox 将恢复到 TextProperty 的值(意思是 “不应在 OneWayToSource 绑定(bind)中使用”)。此重读是否适用于 .NET 4.0 中的 OneWayToSource 绑定(bind)?我只希望 TextBox 将其值推送到 TextProperty 而不是相反。

更新
向这个问题添加赏金,因为这已成为我项目中的主要不便,我想知道这种情况发生变化的原因。似乎 get 是在 Binding 更新源后调用的。这是 .NET 4.0 中 OneWayToSource 绑定(bind)所需的行为吗?

如果是

  • 它在 3.5 中的工作方式有什么问题?
  • 这种新行为在什么情况下更好?

或者这实际上是我们希望在未来版本中修复的错误吗?

最佳答案

Karl Shifflett 的博客和@Simpzon 的回答已经涵盖了他们添加此功能的原因,以及为什么对于始终获得已设置内容的属性来说这不是问题。在您自己的代码中,您始终使用具有正确绑定(bind)语义的中间属性,并使用具有所需语义的内部属性。我将中间属性称为“阻塞”属性,因为它会阻止 getter 到达您的内部属性。

但如果您无权访问要为其设置属性的实体的源代码并且您想要旧的行为,则可以使用转换器。

这是一个带有状态的阻塞转换器:

public class BlockingConverter : IValueConverter
{
public object lastValue;

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return lastValue;
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
lastValue = value;
return value;
}
}

您可以像这样将它用于您的示例:

<Grid>
<Grid.Resources>
<local:BlockingConverter x:Key="blockingConverter" x:Shared="False"/>
</Grid.Resources>
<StackPanel>
<TextBox Text="{Binding TextProperty, Mode=OneWayToSource, Converter={StaticResource blockingConverter}}"/>
<Button Content="Click"/>
</StackPanel>
</Grid>

请注意,因为转换器有一个状态,所以每次使用资源时都需要一个单独的实例,为此我们可以使用 x:Shared="False"资源上的属性。

关于c# - OneWayToSource 绑定(bind)在 .NET 4.0 中似乎已损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4875751/

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