2010-10-22 3 views
2

Я новичок в WPF, поэтому, вероятно, это что-то очень основное, что я забываю делать, но я не вижу, что это такое.WPF ComboBox не меняет выбранный элемент

У меня есть окно со списком, которое отображает некоторые данные, я хочу, чтобы пользователь выбирал категорию в этом поле со списком. Он работает частично. В окне отображается сводка, начинающаяся без выбора, затем пользователь выбирает элемент, и он установлен, но если пользователь пытается перейти на другой элемент, ничего не работает, он сохраняет исходный выбранный элемент.

Вот мне код:

[Категория класс]

public class Category { 
    public long CategoryId { get; set; } 
    public string Name { get; set; } 
    public Category MotherCategory { get; set; } 
    public ICollection<Category> Categories { get; set; } 
    public int Align { get; set; } 
} 

[ComboBox XAML]

<ComboBox Grid.Column="1" x:Name="motherCategoryComboBox" Margin="0,6,12,1" 
    IsSynchronizedWithCurrentItem="True"> 
    <ComboBox.Resources> 
     <converter:LeftMarginConverter x:Key="LeftMarginConverter" /> 
    </ComboBox.Resources> 
    <ComboBox.ItemTemplate> 
     <HierarchicalDataTemplate ItemsSource="{Binding Path=Categories}"> 
      <TextBlock Text="{Binding Path=Name}" Margin="{Binding Path=Align, Converter={StaticResource LeftMarginConverter}}" /> 
     </HierarchicalDataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 

[код-за окна файла]

public CategoryWindow() 
    { 
     InitializeComponent(); 

     db = new JaspeContext(); 
     categorieslist = db.Categories.ToList(); 

     motherCategoryComboBox.ItemsSource = categorieslist; 

     Title = "Add category"; 
    } 

[Преобразователь]

public class LeftMarginConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     double leftMargin = double.Parse(value.ToString()); 

     if (leftMargin != 1) 
      leftMargin = leftMargin * 9; 

     return new Thickness(leftMargin, 0, 0, 0); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new Exception("The method or operation is not implemented."); 
    } 
} 

Нужна ваша помощь. Это делает меня сумасшедшим!

Спасибо!

ответ

3

Надеюсь, я правильно понял ваш вопрос. Является ли ваш объект DataContext объектом Category? Мне кажется, что вам нужно связать свойство SelectedItem ComboBox. Например:

<ComboBox Grid.Column="1" x:Name="motherCategoryComboBox" Margin="0,6,12,1" 
IsSynchronizedWithCurrentItem="True" SelectedItem="{Binding MotherCategory , Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> 
+0

Я не устанавливаю DataContext, я передаю List прямо к свойству ItemSource в поле со списком. – Alaor

+0

Простите, я принял ваш ответ, но я обнаружил, что происхождение поведения было более неясным. Я переопределил метод Equals категории, а затем он вызывал странные вещи в combobox. – Alaor

+0

И ps: Я хочу убить себя. – Alaor

0

Это не ваш случай, но так как это случилось со мной я публикую это здесь, чтобы помочь другим людям, которые могли бы наткнуться на этот вопрос ...

В обработчике comboBoxSelectionChangeCommitted() событий Я добавил следующую строку:

combobox.Text = combobox.Text.Trim(); 

, что она является сброс selectedIndex и selectedText свойства и не позволяли им менять на новое значение в связи с клавиатуры или мыши I Nput.

+0

Если вы это сделаете, не повлияет ли он на отображаемый результат в раскрывающемся списке в любое время, когда вы его на самом деле выбираете? – vapcguy

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