From d89cbe19faa3f2f9ad6be0f08dbfd3f578050213 Mon Sep 17 00:00:00 2001 From: brianlagunas_cp Date: Fri, 14 Oct 2011 23:23:30 +0000 Subject: [PATCH] working on the CheckComboBox and CheckListBox. Do not use them, they are not ready. --- .../Samples.Modules.Color/Views/HomeView.xaml | 45 +++++- .../Views/HomeView.xaml.cs | 129 ++++++++++++++++++ .../Views/HomeView.xaml | 2 +- .../Samples.Modules.Text/Views/HomeView.xaml | 6 +- .../Views/HomeView.xaml.cs | 24 ++++ .../Implementation/CheckComboBox.cs | 23 +++- .../Core/Primitives/Selector.cs | 86 ++++++++---- 7 files changed, 278 insertions(+), 37 deletions(-) diff --git a/ExtendedWPFToolkitSolution/Src/Samples/Modules/Samples.Modules.Color/Views/HomeView.xaml b/ExtendedWPFToolkitSolution/Src/Samples/Modules/Samples.Modules.Color/Views/HomeView.xaml index 82c3dc1f..b3ac6181 100644 --- a/ExtendedWPFToolkitSolution/Src/Samples/Modules/Samples.Modules.Color/Views/HomeView.xaml +++ b/ExtendedWPFToolkitSolution/Src/Samples/Modules/Samples.Modules.Color/Views/HomeView.xaml @@ -2,8 +2,49 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:infControls="clr-namespace:Samples.Infrastructure.Controls;assembly=Samples.Infrastructure" + xmlns:extToolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit/extended" + xmlns:System="clr-namespace:System;assembly=mscorlib" Title="Color Controls"> - - + + + + + + + + + + + + + + diff --git a/ExtendedWPFToolkitSolution/Src/Samples/Modules/Samples.Modules.Color/Views/HomeView.xaml.cs b/ExtendedWPFToolkitSolution/Src/Samples/Modules/Samples.Modules.Color/Views/HomeView.xaml.cs index 12f1db2f..cdffed60 100644 --- a/ExtendedWPFToolkitSolution/Src/Samples/Modules/Samples.Modules.Color/Views/HomeView.xaml.cs +++ b/ExtendedWPFToolkitSolution/Src/Samples/Modules/Samples.Modules.Color/Views/HomeView.xaml.cs @@ -1,6 +1,9 @@ using System; using Samples.Infrastructure.Controls; using Microsoft.Practices.Prism.Regions; +using System.ComponentModel; +using System.Collections.Generic; +using System.Collections.ObjectModel; namespace Samples.Modules.Color.Views { @@ -13,6 +16,132 @@ namespace Samples.Modules.Color.Views public HomeView() { InitializeComponent(); + + DataContext = new Data(); + + //List colors = new List(); + //colors.Add("1"); + //colors.Add("2"); + //colors.Add("3"); + //colors.Add("4"); + //colors.Add("5"); + //colors.Add("6"); + //colors.Add("7"); + //colors.Add("8"); + //colors.Add("9"); + //colors.Add("10"); + + + List colors = new List(); + colors.Add(new Person(System.Windows.Media.Colors.Red, 0)); + colors.Add(new Person(System.Windows.Media.Colors.Purple, 1)); + colors.Add(new Person(System.Windows.Media.Colors.Coral, 2)); + colors.Add(new Person(System.Windows.Media.Colors.MidnightBlue, 3)); + colors.Add(new Person(System.Windows.Media.Colors.Green, 4)); + colors.Add(new Person(System.Windows.Media.Colors.Red, 5)); + colors.Add(new Person(System.Windows.Media.Colors.Purple, 6)); + colors.Add(new Person(System.Windows.Media.Colors.SaddleBrown, 7)); + colors.Add(new Person(System.Windows.Media.Colors.MidnightBlue, 8)); + colors.Add(new Person(System.Windows.Media.Colors.Green, 9)); + colors.Add(new Person(System.Windows.Media.Colors.Red, 10)); + colors.Add(new Person(System.Windows.Media.Colors.Purple, 11)); + colors.Add(new Person(System.Windows.Media.Colors.SaddleBrown, 12)); + colors.Add(new Person(System.Windows.Media.Colors.MidnightBlue, 13)); + colors.Add(new Person(System.Windows.Media.Colors.Green, 14)); + colors.Add(new Person(System.Windows.Media.Colors.Red, 15)); + colors.Add(new Person(System.Windows.Media.Colors.Purple, 16)); + colors.Add(new Person(System.Windows.Media.Colors.SaddleBrown, 17)); + colors.Add(new Person(System.Windows.Media.Colors.MidnightBlue, 18)); + colors.Add(new Person(System.Windows.Media.Colors.Green, 19)); + + //_dataGrid.ItemsSource = colors; + //_chk.ItemsSource = colors; + _combo.ItemsSource = colors; + //_combo.SelectedValue = "1,3,5,7,9,"; + + _listBox.ItemsSource = colors; + //_listBox.DelimitedValue = "1,3,5,7,9,"; + } + } + + public class Data + { + private string _selectedValues;// = "1,3,5,7,9,"; + public string SelectedValues + { + get + { + return _selectedValues; + } + set + { + _selectedValues = value; + } } + + private ObservableCollection _selectedItems = new ObservableCollection() + { + new Person(System.Windows.Media.Colors.Red, 0), + new Person(System.Windows.Media.Colors.Coral, 2) + }; + + public ObservableCollection SelectedItems + { + get { return _selectedItems; } + set + { + _selectedItems = value; + } + } } + + public class Person : INotifyPropertyChanged + { + private bool _isSelected; + public bool IsSelected + { + get { return _isSelected; } + set + { + _isSelected = value; + OnPropertyChanged("IsSelected"); + } + } + + System.Windows.Media.Color _color; + public System.Windows.Media.Color Color + { + get { return _color; } + set + { + _color = value; + OnPropertyChanged("Color"); + } + } + + int _level; + public int Level + { + get { return _level; } + set { _level = value; OnPropertyChanged("Level"); } + } + + public Person() + { + } + + public Person(System.Windows.Media.Color color, int level) + { + this._color = color; + this._level = level; + } + + public event PropertyChangedEventHandler PropertyChanged; + protected void OnPropertyChanged(string propertyName) + { + if (PropertyChanged != null) + PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); + } + } + } diff --git a/ExtendedWPFToolkitSolution/Src/Samples/Modules/Samples.Modules.DateTime/Views/HomeView.xaml b/ExtendedWPFToolkitSolution/Src/Samples/Modules/Samples.Modules.DateTime/Views/HomeView.xaml index f55840bf..d1297321 100644 --- a/ExtendedWPFToolkitSolution/Src/Samples/Modules/Samples.Modules.DateTime/Views/HomeView.xaml +++ b/ExtendedWPFToolkitSolution/Src/Samples/Modules/Samples.Modules.DateTime/Views/HomeView.xaml @@ -5,6 +5,6 @@ xmlns:infControls="clr-namespace:Samples.Infrastructure.Controls;assembly=Samples.Infrastructure" Title="DateTime Controls"> - + diff --git a/ExtendedWPFToolkitSolution/Src/Samples/Modules/Samples.Modules.Text/Views/HomeView.xaml b/ExtendedWPFToolkitSolution/Src/Samples/Modules/Samples.Modules.Text/Views/HomeView.xaml index 66b8914f..947cabd9 100644 --- a/ExtendedWPFToolkitSolution/Src/Samples/Modules/Samples.Modules.Text/Views/HomeView.xaml +++ b/ExtendedWPFToolkitSolution/Src/Samples/Modules/Samples.Modules.Text/Views/HomeView.xaml @@ -2,8 +2,12 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:infControls="clr-namespace:Samples.Infrastructure.Controls;assembly=Samples.Infrastructure" + xmlns:extToolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit/extended" Title="Text Controls"> - + diff --git a/ExtendedWPFToolkitSolution/Src/Samples/Modules/Samples.Modules.Text/Views/HomeView.xaml.cs b/ExtendedWPFToolkitSolution/Src/Samples/Modules/Samples.Modules.Text/Views/HomeView.xaml.cs index 93bf4bfc..c57e379b 100644 --- a/ExtendedWPFToolkitSolution/Src/Samples/Modules/Samples.Modules.Text/Views/HomeView.xaml.cs +++ b/ExtendedWPFToolkitSolution/Src/Samples/Modules/Samples.Modules.Text/Views/HomeView.xaml.cs @@ -1,6 +1,7 @@ using System; using Samples.Infrastructure.Controls; using Microsoft.Practices.Prism.Regions; +using System.Collections.Generic; namespace Samples.Modules.Text.Views { @@ -13,6 +14,29 @@ namespace Samples.Modules.Text.Views public HomeView() { InitializeComponent(); + + _textBox.Text = "1;2;"; //is of object ids + _textBox.ItemsSource = new List() + { + new Email() { Id = 1, FirstName = "John", LastName = "Doe", EmailAddress = "john@test.com" }, + new Email() { Id = 2, FirstName = "Jane", LastName = "Doe", EmailAddress = "jane@test.com" }, + }; + } + + public class Email + { + public int Id { get; set; } + public string FirstName { get; set; } + public string LastName { get; set; } + public string EmailAddress { get; set; } + + public string FullName + { + get + { + return String.Format("{0}, {1}", LastName, FirstName); + } + } } } } diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/CheckComboBox/Implementation/CheckComboBox.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/CheckComboBox/Implementation/CheckComboBox.cs index eb885f40..619cee32 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/CheckComboBox/Implementation/CheckComboBox.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/CheckComboBox/Implementation/CheckComboBox.cs @@ -6,7 +6,7 @@ namespace Microsoft.Windows.Controls { public class CheckComboBox : Selector { - private bool _surpressTextUpdate; + private bool _surpressTextUpdateFromSelectedValueChanged; #region Constructors @@ -58,20 +58,33 @@ namespace Microsoft.Windows.Controls #region Base Class Overrides + public override void OnApplyTemplate() + { + base.OnApplyTemplate(); + } + protected override void OnSelectedValueChanged(string oldValue, string newValue) { base.OnSelectedValueChanged(oldValue, newValue); - if (!_surpressTextUpdate) + if (!_surpressTextUpdateFromSelectedValueChanged) UpdateTextFromSelectedValue(); } + protected override void OnSelectedItemsCollectionChanged(object item, bool remove) + { + _surpressTextUpdateFromSelectedValueChanged = true; + base.OnSelectedItemsCollectionChanged(item, remove); + UpdateDisplayText(item, remove); + _surpressTextUpdateFromSelectedValueChanged = false; + } + protected override void Update(object item, bool remove) { - _surpressTextUpdate = true; + _surpressTextUpdateFromSelectedValueChanged = true; base.Update(item, remove); UpdateDisplayText(item, remove); - _surpressTextUpdate = false; + _surpressTextUpdateFromSelectedValueChanged = false; } #endregion //Base Class Overrides @@ -112,8 +125,6 @@ namespace Microsoft.Windows.Controls private void UpdateTextFromSelectedValue() { - UpdateText(String.Empty); - if (!String.IsNullOrEmpty(SelectedValue)) { string[] values = SelectedValue.Split(new string[] { Delimiter }, StringSplitOptions.RemoveEmptyEntries); diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Primitives/Selector.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Primitives/Selector.cs index 344de4bc..7d70cb34 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Primitives/Selector.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Primitives/Selector.cs @@ -6,6 +6,7 @@ using System.Windows.Controls; using System.Windows.Data; using System.ComponentModel; using System.Windows.Input; +using System.Collections.Specialized; namespace Microsoft.Windows.Controls.Primitives { @@ -88,18 +89,44 @@ namespace Microsoft.Windows.Controls.Primitives protected virtual void OnSelectedItemsChanged(IList oldValue, IList newValue) { - - } + if (oldValue != null) + { + var collection = oldValue as INotifyCollectionChanged; + if (collection != null) + collection.CollectionChanged -= SelectedItems_CollectionChanged; + } - #endregion SelectedItems + if (newValue != null) + { + var collection = newValue as INotifyCollectionChanged; + if (collection != null) + collection.CollectionChanged += SelectedItems_CollectionChanged; + } + } + + void SelectedItems_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) + { + if (e.Action == NotifyCollectionChangedAction.Add) + { + var item = e.NewItems[0]; + OnSelectedItemsCollectionChanged(item, false); + } + else if (e.Action == NotifyCollectionChangedAction.Remove) + { + var item = e.OldItems[0]; + OnSelectedItemsCollectionChanged(item, true); + } + } - public static readonly DependencyProperty SelectedMemberPathProperty = DependencyProperty.Register("SelectedMemberPath", typeof(string), typeof(Selector), new UIPropertyMetadata(null)); - public string SelectedMemberPath + protected virtual void OnSelectedItemsCollectionChanged(object item, bool remove) { - get { return (string)GetValue(SelectedMemberPathProperty); } - set { SetValue(SelectedMemberPathProperty, value); } + //var selectorItem = ItemContainerGenerator.ContainerFromItem(item) as SelectorItem; + //selectorItem.IsSelected = !remove; + UpdateSelectedValue(item, remove); } + #endregion SelectedItems + #region SelectedValue public static readonly DependencyProperty SelectedValueProperty = DependencyProperty.Register("SelectedValue", typeof(string), typeof(Selector), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnSelectedValueChanged)); @@ -157,36 +184,41 @@ namespace Microsoft.Windows.Controls.Primitives protected override void PrepareContainerForItemOverride(DependencyObject element, object item) { _surpressSelectionChanged = true; + bool isSelected = false; var selectorItem = element as FrameworkElement; + var value = item; + + //let's check if we can find a value on the item using the SelectedValuePath property + if (!String.IsNullOrEmpty(SelectedValuePath)) + { + var property = item.GetType().GetProperty(SelectedValuePath); + if (property != null) + { + value = property.GetValue(item, null); + } + } - //first try resolving SelectorItem.IsSelected by data binding to the SelectedMemeberPath property - if (!String.IsNullOrEmpty(SelectedMemberPath)) + //now check to see if the SelectedValue string contains our value. If it does then set Selector.IsSelected to true + if (!String.IsNullOrEmpty(SelectedValue) && SelectedValue.Contains(GetDelimitedValue(value))) { - Binding selectedBinding = new Binding(SelectedMemberPath); - selectedBinding.Mode = BindingMode.TwoWay; - selectedBinding.Source = item; - selectorItem.SetBinding(SelectorItem.IsSelectedProperty, selectedBinding); + isSelected = true; } - else + else if (SelectedItems != null) { - //if the SelectedMemberPath property is not set, then default to the value of the item - var value = item; - - //now let's check if we can find a value on the item using the SelectedValuePath property - if (!String.IsNullOrEmpty(SelectedValuePath)) + //if we get here we could find the value in the SelectedValue property, so lets search the SelectedItems for a match + foreach (object selectedItem in SelectedItems) { - var property = item.GetType().GetProperty(SelectedValuePath); - if (property != null) + //a match was found so select it and get the hell out of here + if (value.Equals(GetItemValue(selectedItem))) { - value = property.GetValue(item, null); + isSelected = true; + break; } } - - //now check to see if the SelectedValue string contains our value. If it does then set Selector.IsSelected to true - if (!String.IsNullOrEmpty(SelectedValue) && SelectedValue.Contains(GetDelimitedValue(value))) - selectorItem.SetValue(SelectorItem.IsSelectedProperty, true); } + selectorItem.SetValue(SelectorItem.IsSelectedProperty, isSelected); + base.PrepareContainerForItemOverride(element, item); _surpressSelectionChanged = false; } @@ -405,7 +437,7 @@ namespace Microsoft.Windows.Controls.Primitives public delegate void SelectedItemChangedEventHandler(object sender, SelectedItemChangedEventArgs e); public class SelectedItemChangedEventArgs : RoutedEventArgs { - public bool IsSelected {get;private set;} + public bool IsSelected { get; private set; } public object Item { get; private set; } public SelectedItemChangedEventArgs(RoutedEvent routedEvent, object source, object item, bool isSelected)