我怎么能得到自定义属性的值

本文关键字:自定义属性 怎么能 | 更新日期: 2023-09-27 18:10:31

我正在寻找一种方法来添加自定义属性到xaml控件。我找到了这个解决方案:在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)总是假的…怎么了?

我怎么能得到自定义属性的值

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

那么你的例子有什么问题呢?

    你的DependencyProperty的getter和setter被错误地创建了。(名称后面不应该有"Property"。)它可能是:
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))
{
  // ...
}
  • 请确保,您的助手。FindVisualChildren工作正常。您可以使用以下命令:
foreach (FrameworkElement child in Container.Children)
{
   // ...
}