2011-09-18 61 views
0

根据类中某个属性的值,是否可以隐藏/显示一个Adorner?使用属性控制装饰者的可见性?

我应该为此使用附加属性吗?

如果是这样,Adorner的可见度究竟如何控制;是否必须手动删除它/将它添加到Dependency Object的OnChanged事件中的Adorner Layer?

这只是我想要做一个非常快速的代码表示:

注意:我甚至不知道它做事的正确方法我想装饰器的知名度。由我的业务模型中的代码修改的属性的值来控制。附加属性的问题是控件的责任是更新属性的值而不是业务域中的代码。)

public static class IsValidBehavior 
{ 
    public static readonly DependencyProperty IsValidProperty = DependencyProperty.RegisterAttached("IsValid", 
                    typeof(bool), 
                    typeof(IsValidBehavior), 
                    new UIPropertyMetadata(false, OnIsValidChanged)); 

    public static bool GetIsValid(DependencyObject obj) 
    { 
     return (bool)obj.GetValue(IsValidProperty); 
    } 
    public static void SetIsValid(DependencyObject obj, bool value) 
    { 
     obj.SetValue(IsValidProperty, value); 
    } 

    private static void OnIsValidChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) 
    { 
     UIElement element = dependencyObject as UIElement; 

     if (element == null) 
      return; 

     if ((bool)e.NewValue == true) 
     { 
      // Display the Adorner 
     } 
     else 
     { 
      // Hide the Adorner 
     } 
    } 
} 
+0

可以提供一些代码吗? – Tigran

+0

在帖子中添加了一个快速代码示例。我只是想出了它,但它应该给出我想要做的事情的一个概念。 –

回答

3

好吧,如果我理解你的问题,在WPF你有两种方法可以做到这一点,从代码或从XAML。从代码,你或多或少的已经做了,在XAML中,你可以做这样的事情,我想:

Visibility="{Binding Path=MyVisibilityVariant, 
     Converter={StaticResource VisibilityConverter}} 

换句话说绑定到一些财产。我一般建议:无论何时,你可以考虑几个变量的使用XAML:

  • XAML声明使得软件非常scallable,但也更复杂(考虑你,或你的团体cappabilities,不知何故做的东西在后面的代码是最好的,如果不仅解决方案可用)

  • 考虑你截止日期,导致XAML的东西实施/调试/修复你将花费更多的时间,然后在代码上。

编辑

Defining custom Adorder in order to be able to define it in XAML

+0

但是我可以绑定XAML中的装饰者的可见性..?一个装饰者甚至可以用XAML来设计..?我的印象是,我们只能在代码中创建/分配装饰者? –

+1

@侯赛因:当然可以,但你需要定义一个自定义类型。最后,Adorner是FrameworkElement,您可以扩展它以便为您的装饰者用户提供XAML支持。看看我编辑过的帖子。 – Tigran

+0

谢谢,我会看看链接并回报。据我所知,我甚至不需要使用附加属性。 –