2017-05-01 28 views
0

我有一个UWP应用以下代码:在UWP枚举固定的ArgumentException的DependencyProperty

public sealed partial class CanvasMapControl : UserControl 
{ 
    public static readonly DependencyProperty ActiveInteractionModeProperty = 
     DependencyProperty.Register(nameof(ActiveInteractionMode), 
            typeof(InteractionMode), 
            typeof(CanvasMapControl), 
            new PropertyMetadata(InteractionMode.None, CanvasMapControl_InteractionModeChanged)); 

    public InteractionMode ActiveInteractionMode { 
     get => (InteractionMode)GetValue(ActiveInteractionModeProperty); 
     set => SetValue(ActiveInteractionModeProperty, value); 
    } 

    private static void CanvasMapControl_InteractionModeChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) 
    { 
     ((CanvasMapControl)obj).InteractionModeInternal = (InteractionMode)args.NewValue; 
    } 

    // ...rest of class... 
} 

InteractionMode是一个枚举。当我尝试运行我的应用程序,我得到以下异常:

System.TypeInitializationException:MyApp.CanvasMapControl“的类型初始值'引发了异常。”

内部例外

ArgumentException:该参数不正确。 createDefaultValueCallback

事情我已经尝试:

  • 改变的DependencyProperty为int和铸造
  • 在传承为null,PropertyMetadata
  • 传递null在为PropertyMetadata
  • 的默认值
  • 传递函数而不是默认值的值

无论我尝试什么,在启动时总是会引发上述异常,以ActiveInteractionMode的SetValue行为目标。我错过了什么让这不起作用?


更新:InteractionModeInternal是将用于让我处理

private InteractionMode _interactionModeInternal; 

private InteractionMode InteractionModeInternal 
{ 
    get => _interactionModeInternal; 
    set 
    { 
     _interactionModeInternal = value; 
     OnInteractionModeInternalChanged(value); 
    } 
} 

private void OnInteractionModeInternalChanged(InteractionMode interactionMode) 
{ 
    Log.Debug($"InternalInteractionMode changed to {interactionMode}"); 
} 

我目前还没有逻辑驱动它关闭过程中暂时改变ActiveInteractionMode一个简单的私人财产,除了它将一个字符串记录到控制台。


更新2:进一步调试后,我已经找到了崩溃发生在启动的原因是,我是有约束力的值在XAML这些属性。在注释掉这些绑定之后,应用程序能够启动,但随后尝试访问Get或Set for ActiveInteractionMode会导致发生与createDefaultValueCallback相同的错误。

+0

如果你改变了行'新PropertyMetadata(InteractionMode.None,...))会发生什么;'这样:'新PropertyMetadata(DependencyProperty.UnsetValue,...));' – Laith

+0

@Laith无影响。同样的问题。 –

+0

您可以尝试关闭Visual Studio并在代码的解决方案目录中删除所有'bin'和'obj'目录。我有一种感觉,东西被锁定,你的自动生成的代码不会更新。 – Laith

回答

0

我已经写了一个样本由你提供段代码。我试图重现你的问题。但是这个问题在我的项目中没有发生。我已经将code sample上传到github。请检查。以下代码是自定义控件,您可以比较以下代码以确定项目中是否存在问题。

public enum InteractionMode 
{ 
    None, 
    Initiative, 
    Passive 
} 

public sealed partial class CustomUserControl : UserControl 
{ 
    public CustomUserControl() 
    { 
     this.InitializeComponent(); 
    } 

public InteractionMode ActiveInteractionMode 
{ 
    get { return (InteractionMode)GetValue(ActiveInteractionModeProperty); } 
    set { SetValue(ActiveInteractionModeProperty, value); } 
} 

public static readonly DependencyProperty ActiveInteractionModeProperty = 
    DependencyProperty.Register("ActiveInteractionMode", typeof(InteractionMode), typeof(CustomUserControl), new PropertyMetadata(InteractionMode.None, CanvasMapControl_InteractionModeChanged)); 

private static void CanvasMapControl_InteractionModeChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) 
{ 
    if (args.OldValue != args.NewValue) 
    { 
     ((CustomUserControl)obj).InteractionModeInternal = (InteractionMode)args.NewValue; 
    } 
} 

private InteractionMode _interactionModeInternal; 

private InteractionMode InteractionModeInternal 
{ 
    get 
    { 
     return _interactionModeInternal; 
    } 

    set 
    { 
     _interactionModeInternal = value; 
     OnInteractionModeInternalChanged(value); 
    } 
} 

private void OnInteractionModeInternalChanged(InteractionMode interactionMode) 
{ 
    System.Diagnostics.Debug.WriteLine($"InternalInteractionMode changed to {interactionMode}"); 
}