在文本框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。

在文本框WPF上设置代码绑定到文本属性不起作用

如果TxtKeyUserControl内的TextBox的名称,那么您就有问题了,因为您无法从其他控件访问控件内的元素。虽然您可以中定义的UserControl中的访问命名控件,但这并不意味着可以从控件外部公开使用。

如果TxtKeyUserControl类型的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);