使用网格的自定义 属性 绑定文本块可见性
Bind textblock visibility with custom property of grid
您好,
在阅读了大量有关可见性绑定的主题数小时后,我在这里提问,因为我无法使我的案例奏效。
我有一个带有自定义附加 属性(类型 System.Windows.Visibily)的网格,我想用它来显示(或不显示)网格内的文本块(通过绑定)。此外,我想在每次自定义附加 属性 更改时更改可见性。
到目前为止我做了什么:
自定义属性 class :
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="" FontFamily="{StaticResource fa-solid}" FontSize="30" Margin="10" Foreground="#375D81" Visibility="{Binding ElementName=server1State, Path=server1State.(local:CustomProperties.starVisibility)}"/>
</Grid>
但是当我 运行 我的应用程序时,文本块绝对没有隐藏,这是可见的,并且永远不会改变。我已经用 Path 和 INotifyPropertyChanged 尝试了很多东西,但是当我使用附加的静态自定义 属性 时,我没能成功。
也许你们中的一些人可以帮助我,谢谢。
你在 TextBlock
上的 Binding.Path
是错误的。
由于我从您的评论中了解到您更喜欢使用布尔值 属性,我将展示如何将 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=""
Visibility="{Binding ElementName=Server1StateGrid,
Path=(CustomProperties.IsStarVisibile),
Converter={StaticResource BooleanToVisibilityConverter}}" />
</Grid>
</Window>
您好,
在阅读了大量有关可见性绑定的主题数小时后,我在这里提问,因为我无法使我的案例奏效。
我有一个带有自定义附加 属性(类型 System.Windows.Visibily)的网格,我想用它来显示(或不显示)网格内的文本块(通过绑定)。此外,我想在每次自定义附加 属性 更改时更改可见性。
到目前为止我做了什么: 自定义属性 class :
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="" FontFamily="{StaticResource fa-solid}" FontSize="30" Margin="10" Foreground="#375D81" Visibility="{Binding ElementName=server1State, Path=server1State.(local:CustomProperties.starVisibility)}"/>
</Grid>
但是当我 运行 我的应用程序时,文本块绝对没有隐藏,这是可见的,并且永远不会改变。我已经用 Path 和 INotifyPropertyChanged 尝试了很多东西,但是当我使用附加的静态自定义 属性 时,我没能成功。
也许你们中的一些人可以帮助我,谢谢。
你在 TextBlock
上的 Binding.Path
是错误的。
由于我从您的评论中了解到您更喜欢使用布尔值 属性,我将展示如何将 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=""
Visibility="{Binding ElementName=Server1StateGrid,
Path=(CustomProperties.IsStarVisibile),
Converter={StaticResource BooleanToVisibilityConverter}}" />
</Grid>
</Window>