WPF - 可以将标签的属性(可见性)绑定到标签的目标吗?

Posted

技术标签:

【中文标题】WPF - 可以将标签的属性(可见性)绑定到标签的目标吗?【英文标题】:WPF - Can one Bind a Label's property (Visibility) to the Label's Target? 【发布时间】:2019-03-26 06:45:34 【问题描述】:

所以我有许多带有各种控件的 XAML 页面,其中大多数都带有指示预期内容的 TextBlock。喜欢:

<TextBlock x:Name="txbCustomerName"
           Text="Customer Name"/>

<TextBox x:Name="txtCustomerName"
         Text="Binding DataObject.CustomerName"/>

我正在用标签替换 TextBlocks,看起来像这样:

<Label x:Name="lblCustomerName"
       Content="Customer Name"
       Target="Binding ElementName=txtCustomerName"/>

<TextBox x:Name="txtCustomerName"
         Text="Binding DataObject.CustomerName"/>

到目前为止,一切都很好。但是,有些控件并不总是可见的。因此,关联的 TextBlock 也随之而来:

<TextBlock x:Name="txbInvoiceAddressStreet"
           Text="Street Name"
           Visibility="Binding DataObject.DifferentInvoiceAddress, Converter=StaticResource BoolToVisibility"/>

<TextBox x:Name="txtInvoiceAddressStreet"
         Text="Binding DataObject.InvoiceAddressStreet"
         Visibility="Binding DataObject.DifferentInvoiceAddress, Converter=StaticResource BoolToVisibility"/>

我或多或少希望标签的可见性在默认情况下会自动等于其目标的可见性,但显然我必须为此努力。没关系,毕竟这是我的工作。

这个初稿效果很好:

<Label x:Name="txbInvoiceAddressStreet"
       Content="Street Name"
       Target="Binding ElementName=txtInvoiceAddressStreet"
       Visibility="Binding Path=Visibility, ElementName=txtInvoiceAddressStreet"/>

<TextBox x:Name="txtInvoiceAddressStreet"
         Text="Binding DataObject.InvoiceAddressStreet"
         Visibility="Binding DataObject.DifferentInvoiceAddress, Converter=StaticResource BoolToVisibility"/>

您会注意到,我的标签的可见性绑定链接到与 Target 相同的元素,而不是针对与 TextBlock 相同的数据元素。我觉得它将相关信息集中在 TextBox 中,而不是在两个控件上传播。

这一切都很好。尽管如此,如果我找到一种方法直接通过 Label 的 Target 属性而不是重用 TextBox 的名称,我会觉得我可能会更进一步。

像这样,除了它不起作用,因为 Source 不是依赖属性:

Visibility="Binding Path=Visibility, Source=Binding Path=Target, RelativeSource=RelativeSource Self"

正如我所说,这不起作用。但是,我希望它传达了我正在努力的意义。

之后的最后一步当然是将可见性移动到标签的默认样式,所以如果有办法做到这一点,我想知道它。

【问题讨论】:

感谢 ASh,创造了奇迹!我看到你用“xaml”替换了“目标”标签。我明白你的意思,因为这非常多是 XAML,但是已经存在的“wpf”标签以及“绑定”清楚地表明我们正在谈论 XAML,而“目标”似乎更具体,所以我想我宁愿保留它。请您详细说明您的推理吗? 【参考方案1】:

在绑定路径中包含 Target 属性:

<Label Visibility="Binding Path=Target.Visibility, RelativeSource=RelativeSource Self"/>

它可以是 Style 的一部分:

<Style TargetType="Label">
    <Setter Property="Visibility"
            Value="Binding Path=Target.Visibility, RelativeSource=RelativeSource Self"/>
</Style>

【讨论】:

以上是关于WPF - 可以将标签的属性(可见性)绑定到标签的目标吗?的主要内容,如果未能解决你的问题,请参考以下文章

WPF - 将 UserControl 可见性绑定到属性

WPF DataGrid的可见性

如何将 WPF DataGrid DataColumns 可见性绑定到 UserControl 的 ViewModel 上的属性?

WPF DataGrid的可见性

如何使用 WPF 中的代码绑定 DataGridTextColumn 的可见性属性?

我可以将 WPF ComboBox 控件的可见性绑定到从命令获得的项目的存在/不存在吗? [关闭]