我怎样才能获得定制属性的价值?

时间:2013-04-23 07:35:57

标签: c# wpf attributes dependency-properties custom-attributes

我一直在寻找一种向xaml控件添加自定义属性的方法。我找到了这个解决方案:Adding custom attributes to an element in XAML?

的Class1.cs:

public static Class1
{
    public static readonly DependencyProperty IsTestProperty = 
       DependencyProperty.RegisterAttached("IsTest",
                                          typeof(bool), 
                                          typeof(Class1),
                                          new FrameworkPropertyMetadata(false));

    public static bool GetIsTestProperty(UIElement element)
    {
        if (element == null)
        {
            throw new ArgumentNullException("element");
        }

        return (bool)element.GetValue(IsTestProperty);
    }

    public static void SetIsTestProperty(UIElement element, bool value)
    {
        if (element == null)
        {
            throw new ArgumentNullException("element");
        }

        element.SetValue(IsTestProperty, value);
    }
}

UserControl.xaml

<StackPanel x:Name="Container">
    <ComboBox x:Name="cfg_Test" local:Class1.IsTest="True" />
    <ComboBox x:Name="cfg_Test" local:Class1.IsTest="False" />
    ...
...

现在是我的问题,我怎样才能获得该物业的价值?

现在我想在StackPanel中读取所有元素的值。

// get all elementes in the stackpanel
foreach (FrameworkElement child in 
            Helpers.FindVisualChildren<FrameworkElement>(control, true))
{
    if(child.GetValue(Class1.IsTest))
    {
        //
    }
}

但是child.GetValue(Class1.IsTest)总是假的...出了什么问题?

1 个答案:

答案 0 :(得分:0)

首先,似乎你的代码充满了错误,所以我不确定,如果你没有正确复制它,或者是什么原因。

你的例子中有什么问题?

  • 错误地创建了DependencyProperty的getter和setter。 (名称上不应附有“财产”。)它应该是:
public static bool GetIsTest(UIElement element)
{
    if (element == null)
    {
        throw new ArgumentNullException("element");
    }

    return (bool)element.GetValue(IsTestProperty);
}

public static void SetIsTest(UIElement element, bool value)
{
    if (element == null)
    {
        throw new ArgumentNullException("element");
    }

    element.SetValue(IsTestProperty, value);
}
  • 其次,StackPanel的两个子控件都使用相同的名称,这是不可能的。
  • 第三,你错误地在你的foreach语句中得到了这个属性。这应该是:
if ((bool)child.GetValue(Class1.IsTestProperty))
{
  // ...
}
  • 请确保您的Helpers.FindVisualChildren正常工作。您可以使用以下代码:
foreach (FrameworkElement child in Container.Children)
{
   // ...
}

希望这有帮助。