2015-12-29 2 views
2

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

Я настраиваю список как:

cboLender.ItemsSource = lenders; 

Список источник пользовательских напечатал список, содержащий Lender объекты. С собственными свойствами: ID и CompanyName.

Затем программно установить его люблю:

 var selectedLender = lenders.SingleOrDefault(x => x.ID == _someId); 
     cboLender.SelectedItem = selectedLender; 
     cboLender.SelectedValuePath = "CompanyName"; 
     cboLender.SelectedValue = selectedLender.CompanyName; 
     //cboLender.DisplayMemberPath = "CompanyName"; 

В коде элемент набор правильно стать SelectedItem, а на UI поле со списком пуст. Так выглядит ничего не найдено был выбран. Я также попробовал свойство path элемента отображения, но это тоже не работает.

Это такая простая проблема, но я сейчас и сейчас пытаюсь и исследовать для себя. Мне нужна помощь.

+0

Вы установили DisplayMemberPath? – Sajeetharan

+0

Я сделал - мог бы сделать с примером, чтобы лучше понять эту проблему - обновил вопрос. – IbrarMumtaz

+0

Пробовал ваш пример на моей стороне и все работало нормально. Где вы разместили свой код, который выбирает компанию? – nkoniishvt

ответ

1

Попробуйте этот код

LenderList = new ObservableCollection<Lender>(); 
      Lender l = new Lender(); 
      l.CompanyName = "11212dffdd"; 
      l.ID = "1"; 
      LenderList.Add(l); 
      cboLender.ItemsSource = LenderList; 
      cboLender.DisplayMemberPath = "CompanyName"; 


      var selectedLender = LenderList.SingleOrDefault(x => x.ID == "1"); 
      cboLender.SelectedItem = selectedLender; 
      cboLender.SelectedValuePath = "CompanyName"; 
      cboLender.SelectedValue = selectedLender.CompanyName; 

в Кодексе за

namespace WpfApplication1 
{ 

    public partial class MainWindow : Window, INotifyPropertyChanged 
    { 
     #region Inotify 
     /// <summary> 
     /// Property Change Event 
     /// </summary> 
     public event PropertyChangedEventHandler PropertyChanged; 

     /// <summary> 
     /// Property Change Method 
     /// </summary> 
     /// <param name="prop">Property Name</param> 
     internal void RaisePropertyChanged(string prop) 
     { 
      if (this.PropertyChanged != null) 
      { 
       this.PropertyChanged(this, new PropertyChangedEventArgs(prop)); 
      } 
     } 

     #endregion 

     #region Constructor 

     public MainWindow() 
     { 
      this.DataContext = this; 
      InitializeComponent(); 
     } 
     #endregion 

     #region Properties 

     private ObservableCollection<Lender> lenderList; 

     public ObservableCollection<Lender> LenderList 
     { 
      get { return lenderList; } 
      set 
      { 
       lenderList = value; 
       RaisePropertyChanged("LenderList"); 
      } 
     } 
     #endregion 

     #region Events 


     private void Window_Loaded(object sender, RoutedEventArgs e) 
     { 
      LenderList = new ObservableCollection<Lender>(); 
      Lender l = new Lender(); 
      l.CompanyName = "11212dffdd"; 
      l.ID = "1"; 
      LenderList.Add(l); 
      cboLender.ItemsSource = LenderList; 
      cboLender.DisplayMemberPath = "CompanyName"; 


      var selectedLender = LenderList.SingleOrDefault(x => x.ID == "1"); 
      cboLender.SelectedItem = selectedLender; 
      cboLender.SelectedValuePath = "CompanyName"; 
      cboLender.SelectedValue = selectedLender.CompanyName; 

     } 
     #endregion 
    } 

    public class Lender : INotifyPropertyChanged 
    { 
     #region Inotify 
     /// <summary> 
     /// Property Change Event 
     /// </summary> 
     public event PropertyChangedEventHandler PropertyChanged; 

     /// <summary> 
     /// Property Change Method 
     /// </summary> 
     /// <param name="prop">Property Name</param> 
     internal void RaisePropertyChanged(string prop) 
     { 
      if (this.PropertyChanged != null) 
      { 
       this.PropertyChanged(this, new PropertyChangedEventArgs(prop)); 
      } 
     } 

     #endregion 

     private string companyName; 

     public string CompanyName 
     { 
      get { return companyName; } 
      set 
      { 
       companyName = value; 
       RaisePropertyChanged("CompanyName"); 
      } 
     } 

     private string id; 

     public string ID 
     { 
      get { return id; } 
      set 
      { 
       id = value; 
       this.RaisePropertyChanged("ID"); 
      } 
     } 
    } 
} 

В XAML

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:cef="clr-namespace:WpfApplication1" 
     xmlns:sys="clr-namespace:System;assembly=mscorlib" 
    Title="Window1" x:Name="testWindow" Height="500" Loaded="Window_Loaded" Width="300" > 
    <Grid > 
     <StackPanel x:Name="stk"> 
      <ComboBox x:Name="cboLender" Width="100"/> 
     </StackPanel> 
    </Grid> 
</Window> 
+1

обновил ответ целым кодом –

+0

Я обнаружил некоторые ошибки привязки в окне вывода. Возможно, ошибка привязки выражения, связанного с xaml. BRB – IbrarMumtaz

+0

У меня были некоторые ошибки привязки в xaml, которые создавали проблемы для меня и препятствовали правильному обновлению пользовательского интерфейса. Спасибо за то, что меня направили в правильном направлении. – IbrarMumtaz

0

Я думаю, вы должны установить SelectedIndex из ComboBox 0. Значение по умолчанию - 1.

+2

Будьте внимательны при редактировании других сообщений. XAML не следует форматировать как фрагмент кода, поскольку он не может быть выполнен на странице SO. – Clemens

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