【问题标题】:Setting Binding in code to Text property on TextBox WPF not working将代码中的绑定设置为 TextBox WPF 上的 Text 属性不起作用
【发布时间】:2015-09-25 23:02:31
【问题描述】:

我在 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 从代理类上的 Text 属性。

我执行以下操作:

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);

这里 lok 是我的用户控件的实例。而 TxtKey 是我的 TextBox 类型的 UserControl 中的属性,它返回 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;
}

重点是我从数据库中的多个控件序列化 xaml,然后动态加载和设置 DataContext。

【问题讨论】:

  • string bnd = "Model.+ lok.Name +.Value"; 这是不正确的绑定语法。你到底想绑定什么?您的问题不清楚。
  • 即绑定路径,可以是任意字符串。那不是问题。这是正确的语法,我只是忘记了引号: string bnd = "Model."+ lok.Name +".Value";我的 DataContext 有动态属性模型,在它的集合中我有动态命名的模型 lok.Name 和属性值,所以路径是正确的。

标签: c# .net wpf xaml data-binding


【解决方案1】:

如果TxtKeyTextBox 内部TextBox 的名称,那么您将遇到问题,因为您无法从其他控件访问控件内部的元素。虽然您可以从定义它们的UserControl内部访问命名控件,但这意味着它们可以从外部公开获得控件。

如果TxtKeyDependencyProperty 类型的UserControl,那么你会发现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);

【讨论】:

  • 我更新了问题的内容。问题是我可以访问 lok.TxtKey.Text,但我不能设置绑定到它(从控件本身外部)。
猜你喜欢
  • 2021-04-02
  • 2021-12-18
  • 2023-03-22
  • 1970-01-01
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
  • 2012-10-12
  • 2017-11-18
相关资源
最近更新 更多