Привязка видимости текстового блока с пользовательским свойством сетки - PullRequest
0 голосов
/ 02 апреля 2020

Здравствуйте,

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

У меня есть сетка с пользовательским вложенным свойством (тип System. Windows .Visibily), которую я хочу использовать для отображения (или нет) текстового блока внутри сетки (путем привязки). Также я хочу изменить видимость каждый раз, когда изменяются пользовательские свойства.

Что я сделал до сих пор: Класс CustomProperties:

    public static class CustomProperties
    {
        public static readonly DependencyProperty starVisibilityProperty = 
            DependencyProperty.RegisterAttached("starVisibility", 
            typeof(System.Windows.Visibility), typeof(CustomProperties), 
            new FrameworkPropertyMetadata(null));

        public static System.Windows.Visibility GetStarVisibility(UIElement element)
        {
            if (element == null)
                throw new ArgumentNullException("element");
            return (System.Windows.Visibility)element.GetValue(starVisibilityProperty);
        }

        public static void SetStarVisibility(UIElement element, System.Windows.Visibility value)
        {
            if (element == null)
                throw new ArgumentNullException("element");
            element.SetValue(starVisibilityProperty, value);
        }
    }

Тогда здесь мой xaml:

            <Grid Name="server1State" Grid.Row="1" local:CustomProperties.StarVisibility="Hidden">
                <TextBlock Name="server1Star" Text="&#xf005;" FontFamily="{StaticResource fa-solid}" FontSize="30" Margin="10" Foreground="#375D81" Visibility="{Binding ElementName=server1State, Path=server1State.(local:CustomProperties.starVisibility)}"/>
            </Grid>

Но когда я запускаю свое приложение, текстовый блок абсолютно не скрыт, он виден и никогда не изменится. Я много чего пробовал с Path, а также с INotifyPropertyChanged, но так как я работаю со стати c пользовательским вложенным свойством, мне не удалось заставить его работать.

Может быть, некоторые из вас могли бы помочь мне, спасибо .

1 Ответ

1 голос
/ 02 апреля 2020

Ваш Binding.Path на TextBlock неправильный.

Поскольку я прочитал из вашего комментария, что вы предпочитаете использовать логическое свойство, я покажу, как преобразовать bool значение для перечисления Visibility с использованием библиотеки BooleanToVisibilityConverter. Я думаю, что вы, возможно, уже получили его, но затем запутались из-за вашей ошибки Binding.Path:

CustomProperties.cs

public class CustomProperties : DependencyObject
{
  #region IsStarVisibile attached property

  public static readonly DependencyProperty IsStarVisibileProperty = DependencyProperty.RegisterAttached(
    "IsStarVisibile",
    typeof(bool),
    typeof(CustomProperties),
    new PropertyMetadata(default(bool)));

  public static void SetIsStarVisibile(DependencyObject attachingElement, bool value) => attachingElement.SetValue(CustomProperties.IsStarVisibileProperty, value);

  public static bool GetIsStarVisibile(DependencyObject attachingElement) => (bool)attachingElement.GetValue(CustomProperties.IsStarVisibileProperty);

  #endregion
}

MainWindow.xaml

<Window>
  <Window.Resources>
    <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
  </Window.Resources>

  <Grid Name="Server1StateGrid"
        CustomProperties.IsStarVisibile="False">
    <TextBlock Text="&#xf005;" 
               Visibility="{Binding ElementName=Server1StateGrid,       
                            Path=(CustomProperties.IsStarVisibile), 
                            Converter={StaticResource BooleanToVisibilityConverter}}" />
  </Grid>
</Window>
...