在文本框WPF上设置代码绑定到文本属性不起作用
本文关键字:文本 绑定 不起作用 代码 属性 设置 WPF | 更新日期: 2023-09-27 18:01:45
我在UserControl中有以下XAML:
<StackPanel Orientation="Horizontal" Name="spContainer">
<TextBlock x:Name="tbLabelBefore" MinWidth="50" Text="{Binding LabelBefore}"></TextBlock>
<TextBox Name="txtKey" MinWidth="120"></TextBox>
<TextBlock Name="tbValue" MinWidth="50"></TextBlock>
</StackPanel>
接下来,我想从代理类中动态地设置绑定到TextBox-txtKey 上的文本属性。
我做了以下事情:
MDLookup lok = SelectedObject as MDLookup;
string bnd = "Model."+ lok.Name +".Value";
Binding binding = new Binding(bnd);
binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
//binding.ValidatesOnDataErrors = true;
//binding.NotifyOnValidationError = true;
binding.Mode = BindingMode.TwoWay;
lok.TxtKey.SetBinding(TextBox.TextProperty, binding);
这是我的用户控件的实例。而TxtKey是我的UserControl类型TextBox的属性,它返回TxtKey元素:
[XmlIgnore]
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public TextBox TxtKey
{
get { return this.txtKey; }
set { this.txtKey = value; }
}
如果我输入:
lok.TxtKey.Text = "Some Text"
这工作。此外,这段用于设置绑定的代码在我的用户控件的构造函数中工作。但这里没有。知道为什么吗?
附加:我已经重载了ShouldSerializeContent
public override bool ShouldSerializeContent()
{
return false;
}
关键是我从databasebase中的多个控件序列化xaml,然后动态加载和设置DataContext。
如果TxtKey
是UserControl
内的TextBox
的名称,那么您就有问题了,因为您无法从其他控件访问控件内的元素。虽然您可以从在中定义的UserControl
中的访问命名控件,但这并不意味着可以从控件外部公开使用。
如果TxtKey
是UserControl
类型的DependencyProperty
,那么您将发现UserControl
类没有有Text
属性,因此您仍然无法绑定到它。如果你不提供进一步的资料,我无法进一步回答。在上面列出的这些情况下,应该收到某种编译或绑定错误…检查Visual Studio中的输出窗口是否有错误。
更新>>>
为了实现你想要的,你需要在你的UserControl
中定义一个DependencyProperty
。我不会在这里告诉你怎么做,因为网上有数百万的例子…假设你把它命名为Text
。将UserControl
中的XAML更改为:
<TextBox Name="txtKey" MinWidth="120" Text="{Binding Text, RelativeSource={RelativeSource
AncestorType={x:Type YourPrefix:YourUserControl}}}" />
然后你将有一个公开可用的属性,数据绑定或外部设置,将更新TextBox.Text
值:
<YourPrefix:YourUserControl Text="{Binding DataBoundTextPropertyOutsideControl}" />
或:
<YourPrefix:YourUserControl Text="Plain text string" />
或者在代码中:
YourUserControl yourUserControl = new YourUserControl();
yourUserControl.Text = "Plain text string";
或:
...
yourUserControl.SetBinding(YourUserControl.TextProperty, binding);