2013-10-22 113 views
0

昨天我遇到了一个帖子,我想我有一个很好的解决方案。这里是http://www.blogs.intuidev.com/post/2011/01/02/combobox_autoopendropdown_attachedbehavior.aspx强制组合框下拉

我曾试图按照那个帖子的链接,因为我是一个新手,WPF和XAML我结束了一个奇怪的错误:Type ComboBox_ForceDropDown initialization failed. The type initializer for ERP_Lite.Views.DesignRelatedCode.ComboBox_ForceDropDown threw an exception.

这里是我的代码:

//ComboBox_ForceDropDown.cs 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 

namespace ERP_Lite.Views.DesignRelatedCode 
{ 
    public static class ComboBox_ForceDropDown 
    { 

     public static readonly DependencyProperty OpenDropDownAutomaticallyProperty = DependencyProperty.Register 
                         (
                          "OpenDropDownAutomatically", 
                          typeof(bool), 
                          typeof(ComboBox_ForceDropDown), 
                          new UIPropertyMetadata(false, onOpenDropDownAutomatically_Changed) 
                         ); 

     public static bool GetOpenDropDownAutomatically(ComboBox cbo) 
     { 
      return (bool)cbo.GetValue(OpenDropDownAutomaticallyProperty); 
     } 
     public static void SetOpenDropDownAutomatically(ComboBox cbo, bool value) 
     { 
      cbo.SetValue(OpenDropDownAutomaticallyProperty, value); 
     } 

     /// <summary> 
     /// Fired when the assignment of the behavior changes (IOW, is being turned on or off). 
     /// </summary> 
     private static void onOpenDropDownAutomatically_Changed(DependencyObject doSource, DependencyPropertyChangedEventArgs e) 
     { 
      //The ComboBox that is the target of the assignment 
      ComboBox cbo = doSource as ComboBox; 
      if (cbo == null) 
       return; 

      //Just to be safe ... 
      if (e.NewValue is bool == false) 
       return; 

      if ((bool)e.NewValue) 
      { 
       //Attach 
       cbo.GotFocus += cbo_GotFocus; 
       cbo.LostFocus += cbo_LostFocus; 
      } 
      else 
      { 
       //Detach 
       cbo.GotFocus -= cbo_GotFocus; 
       cbo.LostFocus -= cbo_LostFocus; 
      } 

     } 

     private static void cbo_GotFocus(object sender, RoutedEventArgs e) 
     { 
      //Open the DropDown/popup as soon as the control is focused 
      ((ComboBox)sender).IsDropDownOpen = true; 
     } 

     private static void cbo_LostFocus(object sender, RoutedEventArgs e) 
     { 
      ((ComboBox)sender).IsDropDownOpen = false; 
     } 
    } 
} 

而XAML文件

//App.xaml 
<Application 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:comboFDD="clr-namespace:ERP_Lite.Views.DesignRelatedCode" 
    x:Class="ERP_Lite.App" StartupUri="Views/MainWindow.xaml"> 
    <Application.Resources> 
     <!-- Resources scoped at the Application level should be defined here. --> 
     <Style TargetType="{x:Type ComboBox}"> 
     <Setter Property="StaysOpenOnEdit" Value="True" /> 
     <Setter Property="comboFDD:ComboBox_ForceDropDown.OpenDropDownAutomatically" Value="True"/> <!--I get error on this line--> 
     </Style> 
    </Application.Resources> 
</Application> 

这里是解决方案管理器的图像:

enter image description here

更新:内异常详细信息如下:

'ComboBox_ForceDropDown' type must derive from DependencyObject. 
+0

异常的详细信息可能会提供一些线索...... – makc

+0

当你得到一个'Exception'这样,您可以点击弹出的链接'Window'称为'查看Details' 。如果你这样做了,另一个'Window'将打开所有'Exception'的细节。要特别注意'内部例外'。 – Sheridan

回答

2

您的物业应该是AttachedDependancyProperty。更新你的财产申报,如:

public static readonly DependencyProperty OpenDropDownAutomaticallyProperty = 
          DependencyProperty.RegisterAttached("OpenDropDownAutomatically", 
          typeof(bool), 
          typeof(ComboBox_ForceDropDown), 
          new UIPropertyMetadata(false, onOpenDropDownAutomatically_Changed) 
          ); 
+0

感谢您提供的答案。现在我明白了使用附加属性和一个实际的例子。 – Khushi

0

DependencyProperty只能在从DependencyObject派生的类来定义。你的课是静态的,因此不能从DependencyObject派生。可能这就是你例外的原因。