简体   繁体   中英

Force a combobox to dropdown

Yesterday I came across a post where I think I got a good solution. Here is the link http://www.blogs.intuidev.com/post/2011/01/02/combobox_autoopendropdown_attachedbehavior.aspx

I have tried to follow that post and As I am a newbie to WPF and XAML I ended up with a strange error : Type ComboBox_ForceDropDown initialization failed. The type initializer for ERP_Lite.Views.DesignRelatedCode.ComboBox_ForceDropDown threw an exception. Type ComboBox_ForceDropDown initialization failed. The type initializer for ERP_Lite.Views.DesignRelatedCode.ComboBox_ForceDropDown threw an exception.

Here is my code:

//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;
        }
    }
}

And the xaml file

//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>

Here is the image of solution explorer :

在此输入图像描述

Update : Inner Exception Details are as follows :

'ComboBox_ForceDropDown' type must derive from DependencyObject.

Your property should be Attached DependancyProperty . Update your property declaration like:

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

A DependencyProperty can only be defined on classes that derive from DependencyObject . Your class is static and thus cannot derive from DependencyObject . Probably that is the reason for your exception.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM