2016-12-28 5 views
0

Я создаю приложение WPF в среде VS 2015 Express. Прямо сейчас я борюсь с проблемой представления значений combobox. Мои сводки выглядят так:WPF-combobox C# выбор не отображается в активном окне

<ComboBox 
    x:Name="cb_pers_ucz" 
    ItemsSource="{Binding Path=Mechanizmy.GlobalObj.SLO_PER_UCZ}" 
    DisplayMemberPath="nazwa" 
    SelectedValuePath="id_poz" 
    IsSynchronizedWithCurrentItem="True" 
    SelectedValue="{Binding Mechanizmy.GlobalObj.SLO_PER_UCZ, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" 
    ToolTip="" 
    HorizontalAlignment="Left" 
    Margin="175,127,0,0" 
    VerticalAlignment="Top" 
    Width="185" 
    Height="22" 
    Grid.Row="1" 
    ToolTipOpening="cb_pers_ucz_ToolTipOpening" 
    /> 

Все работает нормально, пока мне не нужно установить выбранное значение с помощью кода C#. Когда я использую свойство SelectedIndex или SelectedValue, combobox меняет значение идентификатора на выбранное, но в окне (GUI) есть пустое значение.

Я использую список «SLO_PER_UCZ» для заполнения combobox. Похоже, что:

public class slowniki 
    { 
     public int id_poz { get; set; } 
     public string nazwa { get; set; } 
     public string definicja { get; set; } 
     public DateTime dt_od { get; set; } 
     public DateTime dt_do { get; set; } 
    } 

    public static List<slowniki> SLO_PER_UCZ = new List<slowniki>(); 

Извините за качество структуры COMBOBOX, но я пытался реализовать несколько решений, которые я нашел на StackOverflow и других порталов (без эффекта).

ответ

0

Mechanizmy.GlobalObj.SLO_PER_UCZ - это коллекция. Он также не может быть выбранным значением. Привяжите SelectedValue к другому свойству, которое примет выбранное значение.

Поскольку вы хотите установить его также, я также покажу вам, как реализовать INotifyPropertyChanged на вашей модели.

public class GlobalObjClassName : INotifyPropertyChanged 
{ 

    // ... etc. etc. etc. ... 
    public static List<slowniki> SLO_PER_UCZ = new List<slowniki>(); 

    private int _selectedIDPoz = -1; 
    public int SelectedIDPoz 
    { 
     get { return _selectedIDPoz; } 
     set 
     { 
      if (value != _selectedIDPoz) 
      { 
       _selectedIDPoz = value; 
       OnPropertyChanged(); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged([CallerMemberName] String propName = null) 
     => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName)); 

XAML:

<ComboBox 
    x:Name="cb_pers_ucz" 
    ItemsSource="{Binding Path=Mechanizmy.GlobalObj.SLO_PER_UCZ}" 
    DisplayMemberPath="nazwa" 
    SelectedValuePath="id_poz" 
    IsSynchronizedWithCurrentItem="True" 
    SelectedValue="{Binding Mechanizmy.GlobalObj.SelectedIDPoz}" 
    ToolTip="" 
    HorizontalAlignment="Left" 
    Margin="175,127,0,0" 
    VerticalAlignment="Top" 
    Width="185" 
    Height="22" 
    Grid.Row="1" 
    ToolTipOpening="cb_pers_ucz_ToolTipOpening" 
    /> 

И не используйте UpdateSourceTrigger=PropertyChanged или Mode=TwoWay, пока не выясню, что они означают. Добавление случайных вещей, которые вы не понимаете, просто тратит ваше время и никуда не денется.

0

Большое спасибо за ваш ответ. Это не был ответ на мой вопрос, но дал мне достаточно информации для решения проблемы.

Еще раз спасибо :)

С наилучшими пожеланиями Себастьян