【发布时间】:2020-04-02 12:34:46
【问题描述】:
您好,
在阅读了几个小时关于可见性绑定的大量主题后,我在这里问,因为我无法使我的案例有效。
我有一个带有自定义附加属性(类型 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="" FontFamily="{StaticResource fa-solid}" FontSize="30" Margin="10" Foreground="#375D81" Visibility="{Binding ElementName=server1State, Path=server1State.(local:CustomProperties.starVisibility)}"/>
</Grid>
但是当我运行我的应用程序时,文本块绝对没有隐藏,这是可见的,并且永远不会改变。我已经用 Path 和 INotifyPropertyChanged 尝试了很多东西,但是当我使用静态自定义附加属性时,我没有设法让它工作。
也许你们中的一些人可以帮助我,谢谢。
【问题讨论】:
-
您是否有任何理由使用自定义属性而不是转换器?另外,为什么属性在 Grid 而不是文本框上?
-
我的自定义属性首先是一个布尔值,我想在绑定期间使用 BooleanToVisibilityConverter 将其转换为可见性,但由于我没有找到如何使其工作,我试图删除“转换步骤” .但我当然更喜欢布尔值。而且我想在网格上有一个属性,因为稍后我将在网格内有很多可以根据属性值改变的东西。它将成为一个“状态属性”,将被转换器转换。
-
我认为您正在使用 MVVM,如果是这样,您为什么不公开一组属性以用于各种可见性状态,例如假设您有截止日期、发票状态和已接受状态 - IsEditable、IsPassedDeadline 和 IsAccepted。然后在 VM 中而不是自定义属性中执行您的业务逻辑。
标签: c# wpf xaml binding attached-properties