Hi All,
I have a user control for multi select combo box. I would like to give custom background color of that control when it is disabled.I tried by setting triigers and Grid resources but couldn't get the solution. Please find below my xaml code.
Please help me out. Thanks in advance
<UserControl x:Class="MultiSelectComboBox.MultiSelectCombo" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"><ComboBox x:Name="_multiSelectCombo" SnapsToDevicePixels="True" OverridesDefaultStyle="True" ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.CanContentScroll="True" IsSynchronizedWithCurrentItem="True"><ComboBox.ItemTemplate><DataTemplate><CheckBox Content="{Binding Title}" IsChecked="{Binding Path=IsSelected, Mode=TwoWay}" Tag="{RelativeSource FindAncestor, AncestorType={x:Type ComboBox}}" Click="CheckBoxClick"/></DataTemplate></ComboBox.ItemTemplate><ComboBox.Template><ControlTemplate TargetType="ComboBox"><Grid><Grid.Resources><Style x:Key="FccMultiSelectComboStyle" TargetType="{x:Type ToggleButton}"><Style.Triggers><Trigger Property="Control.IsEnabled" Value="False"><Setter Property="OverridesDefaultStyle" Value="False"></Setter><Setter Property="Control.Background" Value="Red"/></Trigger></Style.Triggers></Style></Grid.Resources><ToggleButton Background="Transparent" BorderBrush="#FF7F9DB9" BorderThickness="1" ToolTip="{Binding Path=Text,Mode=TwoWay,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}" Name="ToggleButton" Style="{StaticResource FccMultiSelectComboStyle}" Content="{Binding Path=Text,Mode=TwoWay,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}" Grid.Column="2" IsChecked="{Binding Path=IsDropDownOpen,Mode=TwoWay,RelativeSource={RelativeSource TemplatedParent}}" Focusable="false" ClickMode="Press" HorizontalContentAlignment="Left" ></ToggleButton><Popup Name="Popup" Placement="Bottom" AllowsTransparency="False" Focusable="False" IsOpen="{TemplateBinding IsDropDownOpen}" PopupAnimation="Slide"><Grid Background="White" Name="DropDown" SnapsToDevicePixels="True" MinWidth="{TemplateBinding ActualWidth}" MaxHeight="{TemplateBinding MaxDropDownHeight}"><Border x:Name="DropDownBorder" BorderThickness="1" BorderBrush="Black"/><ScrollViewer Margin="4,6,4,6" SnapsToDevicePixels="True" DataContext="{Binding}"><StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained" /></ScrollViewer></Grid></Popup></Grid><ControlTemplate.Triggers><Trigger Property="HasItems" Value="false"><Setter TargetName="DropDownBorder" Property="MinHeight" Value="95"/></Trigger><Trigger SourceName="Popup" Property="Popup.AllowsTransparency" Value="true"><Setter TargetName="DropDownBorder" Property="CornerRadius" Value="4"/><Setter TargetName="DropDownBorder" Property="Margin" Value="0,2,0,0"/></Trigger></ControlTemplate.Triggers></ControlTemplate></ComboBox.Template></ComboBox></UserControl>
Code behind:
using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; namespace MultiSelectComboBox { /// <summary> /// Interaction logic for MultiSelectCombo.xaml /// </summary> public partial class MultiSelectCombo : UserControl { private ObservableCollection<Node> _nodeList; public MultiSelectCombo() { InitializeComponent(); _nodeList = new ObservableCollection<Node>(); } #region Dependency Properties public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register("ItemsSource", typeof(Dictionary<string, object>), typeof(MultiSelectCombo), new FrameworkPropertyMetadata(null, new PropertyChangedCallback(OnItemsSourceChanged))); public static readonly DependencyProperty SelectedItemsProperty = DependencyProperty.Register("SelectedItems", typeof(Dictionary<string, object>), typeof(MultiSelectCombo), new FrameworkPropertyMetadata(null, new PropertyChangedCallback(OnSelectedItemsChanged))); public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(MultiSelectCombo), new UIPropertyMetadata(string.Empty)); public static readonly DependencyProperty DefaultTextProperty = DependencyProperty.Register("DefaultText", typeof(string), typeof(MultiSelectCombo), new UIPropertyMetadata(string.Empty)); public Dictionary<string, object> ItemsSource { get { return (Dictionary<string, object>)GetValue(ItemsSourceProperty); } set { SetValue(ItemsSourceProperty, value); } } public Dictionary<string, object> SelectedItems { get { return (Dictionary<string, object>)GetValue(SelectedItemsProperty); } set { SetValue(SelectedItemsProperty, value); } } public string Text { get { return (string)GetValue(TextProperty); } set { SetValue(TextProperty, value); } } public string DefaultText { get { return (string)GetValue(DefaultTextProperty); } set { SetValue(DefaultTextProperty, value); } } #endregion #region Events private static void OnItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var control = (MultiSelectCombo)d; control.DisplayInControl(); } private static void OnSelectedItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var control = (MultiSelectCombo)d; control.SelectNodes(); control.SetText(); } private void CheckBoxClick(object sender, RoutedEventArgs e) { var clickedBox = (CheckBox)sender; if (clickedBox.Content.ToString() == "All") { if (clickedBox.IsChecked != null && (bool)clickedBox.IsChecked) { foreach (Node node in _nodeList) { node.IsSelected = true; } } else { foreach (Node node in _nodeList) { node.IsSelected = false; } } } else { var selectedCount = _nodeList.Count(s => s.IsSelected && s.Title != "All"); var firstOrDefault = _nodeList.FirstOrDefault(i => i.Title == "All"); if (firstOrDefault != null) firstOrDefault.IsSelected = selectedCount == _nodeList.Count - 1; } BindSelectedItems(); SetText(); } #endregion #region Methods private void SelectNodes() { if (SelectedItems != null) { foreach (var node in SelectedItems.Select(keyValue => _nodeList.FirstOrDefault(i => i.Title == keyValue.Key)).Where(node => node != null)) { node.IsSelected = true; } } var selectedCount = _nodeList.Count(s => s.IsSelected && s.Title != "All"); _nodeList.FirstOrDefault(i => i.Title == "All").IsSelected = selectedCount == _nodeList.Count - 1; } private void BindSelectedItems() { if (SelectedItems == null) SelectedItems = new Dictionary<string, object>(); SelectedItems.Clear(); foreach (var node in _nodeList.Where(node => node.IsSelected && node.Title != "All").Where(node => ItemsSource.Count > 0)) { SelectedItems.Add(node.Title, ItemsSource[node.Title]); } } public void SetSelectedItems() { if (SelectedItems == null) SelectedItems = new Dictionary<string, object>(); else { foreach (var node in _nodeList.Where(node => node.IsSelected)) { node.IsSelected = false; } foreach (var node in from selectedItem in SelectedItems from node in _nodeList where node.Title == selectedItem.Key select node) { node.IsSelected = true; } SelectedItems.Clear(); foreach (var node in _nodeList.Where(node => node.IsSelected && node.Title != "All").Where(node => ItemsSource.Count > 0)) { SelectedItems.Add(node.Title, ItemsSource[node.Title]); } } SetText(); } private void DisplayInControl() { _nodeList.Clear(); if (ItemsSource.Count > 0) _nodeList.Add(new Node("All")); foreach (var node in ItemsSource.Select(keyValue => new Node(keyValue.Key))) { _nodeList.Add(node); } _multiSelectCombo.ItemsSource = _nodeList; } private void SetText() { if (SelectedItems != null) { var displayText = new StringBuilder(); foreach (var s in _nodeList) { if (s.IsSelected && s.Title == "All") { displayText = new StringBuilder(); displayText.Append("All"); break; } if (s.IsSelected && s.Title != "All") { displayText.Append(s.Title); displayText.Append(','); } } Text = displayText.ToString().TrimEnd(new[] { ',' }); } // set DefaultText if nothing else selected if (string.IsNullOrEmpty(Text)) { Text = DefaultText; } } #endregion } public class Node : INotifyPropertyChanged { private string _title; private bool _isSelected; #region ctor public Node(string title) { Title = title; } #endregion #region Properties public string Title { get { return _title; } set { _title = value; NotifyPropertyChanged("Title"); } } public bool IsSelected { get { return _isSelected; } set { _isSelected = value; NotifyPropertyChanged("IsSelected"); } } #endregion public event PropertyChangedEventHandler PropertyChanged; protected void NotifyPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } } }