2014-11-11 4 views
1

У меня есть редактируемое поле со списком, которое теряет значение, если источник элемента изменен таким образом, что текущий выбранный элемент удален из источника элемента.Редактируемое поле Combo теряет выбранное значение при изменении источника элемента

Код является s следует,

<ComboBox x:Name="TableNameCombo" 
      MinWidth="100" 
      IsEditable="True" 
      ItemsSource="{Binding TableNames}" 
      SelectionChanged="TableNameCombo_SelectionChanged" 
      Text="{Binding TableName, 
       ValidatesOnDataErrors=True, 
       UpdateSourceTrigger=PropertyChanged}" /> 

Если я нахожусь в differnent зрения, когда источник товара изменяется, значение сохраняется. Значение теряется, только если источник items изменяется при активном представлении с combobox.

Пожалуйста, помогите мне, как сохранить значение COMBOBOX, даже если его нет в ItemSource и исходный элемент изменяется, когда вид comtaining выпадающий активен

Примечание:

1.By вид я я имею панель с вкладками и имеет разный вид во всех вкладках .

2.Я не говорю о каком-либо снижении стоимости. Я просто хочу, чтобы сохранял любое выбранное значение, даже если его нет в .

Позвольте мне прояснить этот вопрос очень простое требование, Это мой скриншот из образца applicaiton,

enter image description here

Когда пользователь вводит элемент в текстовом поле и нажимает кнопку удалить кнопку элемента в элемент удаляется из коллекции, которая является itemSource для Combobox. Но когда я делаю это, элемент не отображается в combobox. enter image description here

Мое требование состоит в том, чтобы сохранить элемент в поле со списком, даже если он отсутствует в коллекции.

+0

Это звучит как хак, а не решение для того, что вы намереваетесь сделать. Какова ваша цель? –

+0

Моя цель - сохранить последнее выбранное значение в выпадающем списке, даже если это значение удалено из коллекции, которая задана как источник элемента. –

+0

Hi @ScottNimrod. Надеюсь, теперь вопрос легко понять. –

ответ

0

Вы можете добавить этот код:

using System.Collections; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 

public static class ComboBoxItemsSourceDecorator 
{ 
    public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.RegisterAttached(
     "ItemsSource", 
     typeof(IEnumerable), 
     typeof(ComboBoxItemsSourceDecorator), 
     new PropertyMetadata(null, ItemsSourcePropertyChanged)); 

    public static void SetItemsSource(UIElement element, bool value) 
    { 
     element.SetValue(ItemsSourceProperty, value); 
    } 

    public static IEnumerable GetItemsSource(UIElement element) 
    { 
     return (IEnumerable)element.GetValue(ItemsSourceProperty); 
    } 

    private static void ItemsSourcePropertyChanged(DependencyObject element, DependencyPropertyChangedEventArgs e) 
    { 
     var target = element as ComboBox; 
     if (element == null) 
     { 
      return; 
     } 

     // Save original binding 
     var originalBinding = BindingOperations.GetBinding(target, ComboBox.TextProperty); 

     BindingOperations.ClearBinding(target, ComboBox.TextProperty); 
     try 
     { 
      target.ItemsSource = e.NewValue as IEnumerable; 
     } 
     finally 
     { 
      if (originalBinding != null) 
      { 
       BindingOperations.SetBinding(target, ComboBox.TextProperty, originalBinding); 
      } 
     } 
    } 
} 

И использовать так:

<ComboBox IsTextSearchEnabled="true" 
    IsTextSearchCaseSensitive="false" 
    options:ComboBoxItemsSourceDecorator.ItemsSource="{Binding Path=Values, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}"      
    Text="{Binding Path = Value}" 
    IsEditable ="True"> 

Это просто basicaly сохраняет связывание с тем же текстом, когда ItemsSouce изменилось.

Примечание: Используйте декораторы ItemsSource, а не строительный.

Смежные вопросы