gpt4 book ai didi

c# - 如何在 XAML 中绑定(bind) UIElements?

转载 作者:太空宇宙 更新时间:2023-11-03 23:18:46 25 4
gpt4 key购买 nike

我有一个类:

class LinkedTextBox: TextBox
{
public TextBox TextBoxA { get; set; }
public TextBox TextBoxB { get; set; }
}

假设我有两个文本框:

    <TextBox x:Name="txt1" />
<TextBox x:Name="txt2" />

如何在我的 Xaml 上指定该文本框?

我的测试:

(1) ""TextBox"的 TypeConverter 不支持从字符串转换。"

    <local:LinkedTextBox TextBoxA="txt1" TextBoxB="txt2" />

(2)“不能在类型为‘LinkedTextBox’的‘TextBoxA’属性上设置‘Binding’。只能在 DependencyObject 的 DependencyProperty 上设置‘Binding’。

    <local:LinkedTextBox 
TextBoxA="{Binding ElementName=txt1}"
TextBoxB="{Binding ElementName=txt2}"
/>

我认为有一个明显的方法可以做到,但我不知道如何...

最佳答案

没错。您的第二个示例是正确的 XAML,但它失败了,因为 TextBoxATextBoxB 是错误类型的属性。 Binding 的目标必须是 DependencyObjectDependencyProperty,就像 jar 头上写的那样。 TextBox 已经是一个 DependencyObject 并且您正在对其进行子类化,因此该部分已得到处理。定义一个 DependencyProperty 很简单。

您可以像这样定义 TextBoxA,并且同样定义 TextBoxB:

public class LinkedTextBox : TextBox
{
#region TextBoxA Property
public TextBox TextBoxA
{
get { return (TextBox)GetValue(TextBoxAProperty); }
set { SetValue(TextBoxAProperty, value); }
}

// Careful with the parameters you pass to Register() here.
public static readonly DependencyProperty TextBoxAProperty =
DependencyProperty.Register("TextBoxA", typeof(TextBox), typeof(LinkedTextBox),
new PropertyMetadata(null));
#endregion TextBoxA Property
}

但是你的意图是什么?你想达到什么目的? 很可能您可以通过以正常方式将现有属性相互绑定(bind)来实现,而无需任何这些子类 monkeyshines。可能你想要一个 attached property ,这是一种特殊类型的依赖属性。

更新

OP 希望添加视觉元素来说明文本框之间的关系。如果要添加视觉叠加层,WPF 方法是编写 an Adorner .因此,您将编写某种具有 TextBoxATextBoxB 依赖属性的 TextBoxLinkingAdorner,并将其应用于主文本框,这取决于您的requirements 甚至不必是子类。

当它们的值改变时,你的依赖属性可能需要做一些工作;如果是这样,它们看起来更像这样,假设有一个名为 TextBoxLinkerAdornerAdorner 子类:

    #region TextBoxA Property
public TextBox TextBoxA
{
get { return (TextBox)GetValue(TextBoxAProperty); }
set { SetValue(TextBoxAProperty, value); }
}


public static readonly DependencyProperty TextBoxAProperty =
DependencyProperty.Register("TextBoxA", typeof(TextBox),
typeof(TextBoxLinkerAdorner),
new FrameworkPropertyMetadata(null,
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
TextBoxA_PropertyChanged)
{ DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged });

protected static void TextBoxA_PropertyChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
var obj = d as TextBoxLinkerAdorner;
}
#endregion TextBoxA Property

如果您在文本框上看到的只是它们的大小和位置,您可能会编写一个链接任意 UIElements 的装饰器,而不仅仅是文本框。天空是极限!如果你能梦想它,你就可以装饰它!

关于c# - 如何在 XAML 中绑定(bind) UIElements?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36204885/

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