C# 如何在XAML中绑定UIElements?
我有一门课:C# 如何在XAML中绑定UIElements?,c#,wpf,xaml,data-binding,dependency-properties,C#,Wpf,Xaml,Data Binding,Dependency Properties,我有一门课: class LinkedTextBox: TextBox { public TextBox TextBoxA { get; set; } public TextBox TextBoxB { get; set; } } 假设我有两个文本框: <TextBox x:Name="txt1" /> <TextBox x:Name="txt2" /> 如何在Xaml上指定文本框 我的测试: (1) “文本框”的类型转换器不支持从
class LinkedTextBox: TextBox
{
public TextBox TextBoxA { get; set; }
public TextBox TextBoxB { get; set; }
}
假设我有两个文本框:
<TextBox x:Name="txt1" />
<TextBox x:Name="txt2" />
如何在Xaml上指定文本框
我的测试:
(1) “文本框”的类型转换器不支持从字符串转换。”
(2) “不能在“LinkedTextBox”类型的“TextBoxA”属性上设置“Binding”。只能在DependencyObject的DependencyProperty上设置“Binding”。”
我认为有一个明显的方法,但我不知道如何…对。第二个示例是正确的XAML,但它失败了,因为
TextBoxA
和TextBoxB
是错误的属性类型。绑定的目标必须是DependencyObject
的dependencProperty
,如tin上所述TextBox
已经是一个DependencyObject
,您正在对它进行子类化,以便处理该部分。而定义一个依赖性属性
是微不足道的
您可以这样定义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
}
但你在这里的意图是什么?你想完成什么?很可能,您可以通过以正常方式将现有属性相互绑定来实现,而不需要这些子类monkeyshines。您可能需要,这是一种特殊类型的依赖属性
更新
OP希望添加说明文本框之间关系的视觉元素。如果要添加可视覆盖,WPF的方法是编写。因此,您可以使用TextBoxA
和TextBoxB
依赖属性编写某种textboxlinkingadarner
,并将其应用于主文本框,根据您的需求,主文本框甚至不必是子类
当依赖项属性的值发生变化时,它们可能需要做一些工作;如果是这样的话,它们看起来更像这样,假设一个名为TextBoxLinkerAdorner
的Adorner子类:
#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
如果您只关注文本框的大小和位置,那么您可以编写一个装饰器来链接任意ui元素
,而不仅仅是文本框。天空是极限!如果你能梦想它,你就能装饰它 我将在视觉上“链接”文本框(实际上是绘制线条),更改两者的视觉效果,可能会更改位置,然后处理两者的文本,在LinkedTextBox中处理并显示结果。我知道通常的方法是直接绑定属性,但是我需要处理很多属性,我认为当我可以直接绑定主UIElement时,绑定十几个属性是非常糟糕的。我将立即阅读有关附加属性的信息,谢谢@点击OK啊,现在我知道你来自哪里了。您可能想看一看,WPFish(除其他外)“在UIElement上覆盖视觉装饰”的方法有哪些。我认为,AdornerLayer应该属于文本框的父级。
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
}
#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