使用枚举附加的DependencyProperty很奇怪

时间:2014-03-20 16:10:17

标签: wpf xaml enums attached-properties

我使用InteractionMode类型定义了一个附加的依赖项属性(它是一个枚举)。看起来像那样:

[Flags]
public enum InteractionMode
{
    Add,
    AppZone,
    Shortcuts,
    MagnetSelection,
    RowColumnChoosing
}

public static readonly DependencyProperty UserSpaceInteractionMode = DependencyProperty.RegisterAttached(
        "UserSpaceInteractionMode", 
        typeof(InteractionMode),
        typeof(LeapConnectorProperties),
        new FrameworkPropertyMetadata(InteractionMode.None, FrameworkPropertyMetadataOptions.None));

public static InteractionMode GetUserSpaceInteractionMode(DependencyObject element)
{
    if (element == null)
    {
         throw new ArgumentNullException("element");
    }
    return (InteractionMode)element.GetValue(UserSpaceInteractionMode);
}

public static void SetUserSpaceInteractionMode(DependencyObject element, InteractionMode value)
{
    if (element == null)
    {
        throw new ArgumentNullException("element");
    }
    element.SetValue(UserSpaceInteractionMode, value);
}

此外,我使用此依赖项属性在XAML中标记特定的UIElements:

<Grid ns:depProp.UserSpaceInteractionMode="Shortcuts,MagnetSelection">

到目前为止一切都还可以。不幸的是,在要求那些枚举时

InteractionMode iMode = depProp.GetUserSpaceInteractionMode(grid);

我得到一个奇怪的结果。它不会抛出错误,但Visual Studio在调试时显示的枚举与我在XAML中定义的枚举不同(例如AppZone | Shortcuts而不是Shortcuts | MagnetSelection)。

当使用iMode.hasFlag(flag)检查来自InteractionMode的所有枚举标志时,结果与Visual Studio所说的相比也会有所不同(例如,在询问true时,它会显示iMode.hasFlag(InteractionMode.Add)

我认为我使用的枚举错误,但我不知道这个问题是什么。谢谢你的任何建议!

1 个答案:

答案 0 :(得分:2)

如果没有专门完成你正在做的事情,我已经看到了其他类似的标志设置,但是当你通过OR可能性允许多个时,枚举必须是二进制的。

The default is implied as 
public enum InteractionMode
{
    Add = 0,
    AppZone = 1,
    Shortcuts = 2,
    MagnetSelection = 3,
    RowColumnChoosing = 4
}

Change to
public enum InteractionMode
{
    Add = 1,
    AppZone = 2,
    Shortcuts = 4,
    MagnetSelection = 8,
    RowColumnChoosing = 16
}

因此,如果原始用户选择Shortcuts和MagnetSelection作为选项,则查看二进制文件

             BINARY
Shortcut 2 = 0010
Magnet   3 = 0011
and you get 
         5 = 0101 binary, so this triggers the "Add" as "1" in the rightmost position.

现在,通过二进制样本更改为快捷方式和magnetSelection,您将获得

Shortcut  4 = 0100
Magnet    8 = 1000
resulting in 12
OR'd     12 = 1100

所以现在测试将正确识别其中一个。