WPF - Можно ли привязать свойство метки (видимость) к цели метки? - PullRequest
0 голосов
/ 22 октября 2018

Итак, у меня есть несколько страниц XAML с различными элементами управления, большинство из которых с TextBlock, указывающим на предполагаемый контент.Как:

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

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

Я нахожусь в процессе замены TextBlocks на Labels, что будет выглядеть так:

<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}}"/>

Вы заметите, что привязка для видимости моей метки связана с тем же элементом, что и цель.вместо нацеливания на тот же элемент данных, что и TextBlock.Я чувствую, что она концентрирует соответствующую информацию в TextBox вместо того, чтобы распространять ее на оба элемента управления.

Все это работает нормально.Тем не менее, я не могу избавиться от ощущения, что мог бы пойти еще дальше, если бы нашел способ применить эту привязку к свойству TextBox непосредственно через свойство Target метки вместо повторного использования имени TextBox.

Вот так, за исключением того, что он не работает, потому что Source не является свойством зависимости:

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

Как я уже сказал, это не работает.Тем не менее, я надеюсь, что это передает смысл того, что я пытаюсь.

Конечным шагом после этого, конечно же, будет перевод Visibility в стиль меток по умолчанию, поэтому, если есть способ сделать это, я бы хотел узнать об этом.

1 Ответ

0 голосов
/ 22 октября 2018

включает свойство 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>
...