0

我正在寻找一种将自定义属性添加到 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);
    }
}

用户控件.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)总是假的……怎么了?

4

1 回答 1

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)
{
   // ...
}

希望这可以帮助。

于 2013-04-23T08:19:14.027 回答