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.