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 b3ac6181..5b2e5157 100644 --- a/ExtendedWPFToolkitSolution/Src/Samples/Modules/Samples.Modules.Color/Views/HomeView.xaml +++ b/ExtendedWPFToolkitSolution/Src/Samples/Modules/Samples.Modules.Color/Views/HomeView.xaml @@ -25,9 +25,10 @@ + DisplayMemberPath="Color" + ValueMemberPath="Level" + SelectedValue="{Binding SelectedValue}" + SelectedItems="{Binding SelectedItems}"/> @@ -39,12 +40,20 @@ + ValueMemberPath="Level" + SelectedMemberPath="IsSelected" + SelectedValue="{Binding SelectedValue}" + SelectedItems="{Binding SelectedItems}"/> + + + + + + 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 cdffed60..9239f32b 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 @@ -34,9 +34,9 @@ namespace Samples.Modules.Color.Views 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.Purple, 1) { IsSelected = true }); 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.MidnightBlue, 3) { IsSelected = true }); 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)); @@ -60,14 +60,19 @@ namespace Samples.Modules.Color.Views //_combo.SelectedValue = "1,3,5,7,9,"; _listBox.ItemsSource = colors; - //_listBox.DelimitedValue = "1,3,5,7,9,"; + //_listBox.SelectedValue = "1,3,5,7,9,"; + } + + private void Button_Click(object sender, System.Windows.RoutedEventArgs e) + { + (DataContext as Data).SelectedValue = "1,3,5,7,9,"; } } - public class Data + public class Data: INotifyPropertyChanged { private string _selectedValues;// = "1,3,5,7,9,"; - public string SelectedValues + public string SelectedValue { get { @@ -76,23 +81,31 @@ namespace Samples.Modules.Color.Views set { _selectedValues = value; + OnPropertyChanged("SelectedValue"); } } - private ObservableCollection _selectedItems = new ObservableCollection() - { - new Person(System.Windows.Media.Colors.Red, 0), - new Person(System.Windows.Media.Colors.Coral, 2) - }; - + private ObservableCollection _selectedItems = new ObservableCollection(); public ObservableCollection SelectedItems { get { return _selectedItems; } set { _selectedItems = value; + OnPropertyChanged("SelectedItems"); } - } + } + + public Data() + { + } + + public event PropertyChangedEventHandler PropertyChanged; + protected void OnPropertyChanged(string propertyName) + { + if (PropertyChanged != null) + PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); + } } public class Person : INotifyPropertyChanged diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Primitives/Selector.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Primitives/Selector.cs index 52d2e69d..7502606e 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Primitives/Selector.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Primitives/Selector.cs @@ -1,12 +1,11 @@ using System; using System.Collections; using System.Collections.ObjectModel; +using System.ComponentModel; using System.Windows; using System.Windows.Controls; using System.Windows.Data; -using System.ComponentModel; using System.Windows.Input; -using System.Collections.Specialized; namespace Microsoft.Windows.Controls.Primitives { @@ -63,6 +62,13 @@ namespace Microsoft.Windows.Controls.Primitives set { SetValue(SelectedItemsProperty, value); } } + public static readonly DependencyProperty SelectedMemberPathProperty = DependencyProperty.Register("SelectedMemberPath", typeof(string), typeof(Selector), new UIPropertyMetadata(null)); + public string SelectedMemberPath + { + get { return (string)GetValue(SelectedMemberPathProperty); } + set { SetValue(SelectedMemberPathProperty, value); } + } + #region SelectedValue public static readonly DependencyProperty SelectedValueProperty = DependencyProperty.Register("SelectedValue", typeof(string), typeof(Selector), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnSelectedValueChanged)); @@ -117,38 +123,52 @@ namespace Microsoft.Windows.Controls.Primitives _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(ValueMemberPath)) + //first try resolving SelectorItem.IsSelected by data binding to the SelectedMemeberPath property + if (!String.IsNullOrEmpty(SelectedMemberPath)) { - var property = item.GetType().GetProperty(ValueMemberPath); - if (property != null) + Binding selectedBinding = new Binding(SelectedMemberPath) + { + Mode = BindingMode.TwoWay, + Source = item + }; + selectorItem.SetBinding(SelectorItem.IsSelectedProperty, selectedBinding); + } + else + { + var value = item; + + //let's check if we can find a value on the item using the SelectedValuePath property + if (!String.IsNullOrEmpty(ValueMemberPath)) { - value = property.GetValue(item, null); + var property = item.GetType().GetProperty(ValueMemberPath); + if (property != null) + { + value = property.GetValue(item, null); + } } - } - //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))) - { - isSelected = true; - } - else if (SelectedItems != null) - { - //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) + //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))) + { + isSelected = true; + } + else if (SelectedItems != null) { - //a match was found so select it and get the hell out of here - if (value.Equals(GetItemValue(selectedItem))) + //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) { - isSelected = true; - break; + //a match was found so select it and get the hell out of here + if (value.Equals(GetItemValue(selectedItem))) + { + isSelected = true; + break; + } } } - } - selectorItem.SetValue(SelectorItem.IsSelectedProperty, isSelected); + selectorItem.SetValue(SelectorItem.IsSelectedProperty, isSelected); + } base.PrepareContainerForItemOverride(element, item); _surpressSelectionChanged = false; @@ -184,7 +204,6 @@ namespace Microsoft.Windows.Controls.Primitives #endregion //Event Handlers - #region Methods protected object GetItemValue(object item) @@ -261,7 +280,7 @@ namespace Microsoft.Windows.Controls.Primitives private void UpdateSelectedValue(object item, bool remove) { //make sure we have a selected value, or we will get an exception - if (String.IsNullOrEmpty(SelectedValue)) + if (SelectedValue == null) UpdateSelectedValue(String.Empty); var value = GetItemValue(item); @@ -280,7 +299,7 @@ namespace Microsoft.Windows.Controls.Primitives } //if the SelectedValue is the same as the updated value then just ignore it - if (!SelectedValue.Equals(value)) + if (!SelectedValue.Equals(updateValue)) UpdateSelectedValue(updateValue); }