gpt4 book ai didi

c# - 覆盖 FrameworkPropertyMetadata 中的 DefaultTwoWayByDefault

转载 作者:太空宇宙 更新时间:2023-11-03 15:11:03 26 4
gpt4 key购买 nike

我想创建一个在其 Text 属性上具有默认 OneWay Binding 的只读 TextBox。就像在 very similar question我的第一次尝试是这样的:

public partial class SelectableTextBlock : TextBox
{
static SelectableTextBlock ()
{
TextBox.TextProperty.OverrideMetadata(typeof(ReadOnlyTextBox),
new FrameworkPropertyMetadata() { BindsTwoWayByDefault = false, Journal = true, DefaultUpdateSourceTrigger = UpdateSourceTrigger.Explicit });
}
public SelectableTextBlock()
{
InitializeComponent();
}
}

我发现这是行不通的,因为 WPF 通过基本上将所有标志组合在一起来组合现有元数据和覆盖元数据。由于 BindsTwoWayByDefault 是这些标志之一,只要元数据对象之一具有 BindsTwoWayByDefault=true 就保持为真。

解决此问题的唯一方法是在 OverrideMetadata 中发生 WPF 合并过程后更改元数据。然而,Metadata 对象在方法中被标记为 Sealed。

作为任何优秀的开发人员,我都会在这里停下来重新考虑......Naaa,我使用反射“解封”元数据对象并将 BindsTwoWayByDefault 设置回 true。

请告诉我,我很愚蠢,没有看到在 WPF 中执行此操作的明显且正确的方法。

这是我的代码:

public partial class SelectableTextBlock : TextBox
{
static SelectableTextBlock()
{
var defaultMetadata = (FrameworkPropertyMetadata)TextProperty.GetMetadata(typeof(TextBox));

var newMetadata = new FrameworkPropertyMetadata(
defaultMetadata.DefaultValue,
FrameworkPropertyMetadataOptions.Journal,
defaultMetadata.PropertyChangedCallback,
defaultMetadata.CoerceValueCallback,
defaultMetadata.IsAnimationProhibited,
defaultMetadata.DefaultUpdateSourceTrigger);

TextProperty.OverrideMetadata(typeof(SelectableTextBlock), newMetadata);

//Workaround for a bug in WPF were the Metadata is merged wrongly and BindsTwoWayByDefault is always true
var sealedProperty = typeof(PropertyMetadata).GetProperty("Sealed", BindingFlags.Instance | BindingFlags.NonPublic);
sealedProperty.SetValue(newMetadata, false);
newMetadata.BindsTwoWayByDefault = false;
sealedProperty.SetValue(newMetadata, true);
}

public SelectableTextBlock()
{
InitializeComponent();
}
}

最佳答案

所以在尝试了将近一年的更好的解决方案之后,我的反射解决方案似乎仍然是最好的解决方案。

关于c# - 覆盖 FrameworkPropertyMetadata 中的 DefaultTwoWayByDefault,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41117132/

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