2012-05-23 4 views
1

У меня есть объект JobItem, и внутри него, у меня есть:Binding Listbox к ObservableCollection <T> не работает WPF

public ObservableCollection<string> BusinessUnit 
    { 
     get 
     { 
      return businessUnit; 
     } 
     set { businessUnit = value; } 

    } 

Теперь пользователь должен заполнить форму и добавить в нескольких бизнес-единиц. Я создал список, который имеет кнопки добавления и удаления рядом с ним. Кнопка добавления открывает диалоговое окно с предложением добавить имя бизнес-единицы, а затем добавляет его в список. Это код, у меня есть для этого:

<my:ValidatingListBox Grid.Column="1" Grid.ColumnSpan="1" Grid.Row="5" Grid.RowSpan="1" x:Name="businessUnitBox" SelectionMode="Multiple" SelectionChanged="ValidatingListBox_SelectionChanged" IsSynchronizedWithCurrentItem="True"> 
      <my:ValidatingListBox.ItemsSource> 
       <Binding Source="{StaticResource jobItemDataSource}" Path="BusinessUnit" Mode="TwoWay"/> 
      </my:ValidatingListBox.ItemsSource> 
      </my:ValidatingListBox> 

    <Button Style="{StaticResource addBtnStyle}" Grid.Column="2" Grid.Row="5" Name="addBusinessUnitBtn" Click="addBusinessUnitBtn_Click" /> 
    <Button Style="{StaticResource removeBtnStyle}" Grid.Column="2" Grid.Row="5" Name="delBusinessUnitBtn" Click="delBusinessUnitBtn_Click" /> 

В коде позади, я связывании JobItem в форме, потому что у меня есть другие текстовые поля, которые связаны с другими JobItems (связывающие работы для этого).

public NewJobDialog(int workOrderCounter) 
    { 
     InitializeComponent(); 
     item = new JobItem(); 
     base.DataContext = item(); 
     businessUnitBox.DataContext = item.BusinessUnit; 
    } 

Затем, когда я нажимаю на кнопку Добавить, чтобы добавить бизнес-единицы, у меня есть этот код:

private void addBusinessUnitBtn_Click(object sender, RoutedEventArgs e) 
    { 
     AddBusinessUnitDialog addBusinessUnit = new AddBusinessUnitDialog(); 
     addBusinessUnit.ShowDialog(); 

     if (addBusinessUnit.DialogResult == true) 
     { 
      item.BusinessUnit.Add(addBusinessUnit.BusinessUnit()); 
     } 

    } 

    private void delBusinessUnitBtn_Click(object sender, RoutedEventArgs e) 
    { 
     if (businessUnitBox.Items.Count > 0) 
     { 
      item.BusinessUnit.Remove((string)businessUnitBox.SelectedItem); 
     } 

    } 

Теперь, когда я запускаю программу, каждый раз, когда я добавить бизнес-единицы, это делает не отображается в списке. Пожалуйста, дайте мне некоторый тип кода примера, как я смогу заставить это работать. Благодарю.

+0

Есть ли причина для 2 экземпляра класса 'JobItem'? Разве вы не хотите использовать тот же самый? – aqwert

+0

На самом деле нет, я переделывал код, который я вставил, спасибо, что заметил, теперь я его обновлю. – Erika

ответ

4

Я считаю, что это потому, что вам необходимо установить DataContext в родительский класс.

businessUnitBox.DataContext = item; 

Это потому, что вы следующий обязательный

<Binding Source="{StaticResource jobItemDataSource}" Path="BusinessUnit" Mode="TwoWay"/> 

Кроме того, вы можете упростить связывание при наличии ..

<my:ValidatingListBox ItemsSource="{Binding BusinessUnit}" ... /> 

EDIT:

Если вы действительно хотите

businessUnitBox.DataContext = item.BusinessUnit; 

Тогда ваши обязательные потребности быть

<my:ValidatingListBox ItemsSource="{Binding Path=." ... /> 
+0

, но я использовал item.BusinessUnit, а не элемент – Erika

+0

DataContext - это путь к корневому уровню, который он находит. Поэтому, когда у вас есть Path = «BusinessUnit» с вашим примером, он пытается найти это свойство на ObersevableCollection, которого не существует – aqwert

+0

О, извините, я не читал это право. это работает, спасибо! – Erika

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