2012-05-23 45 views
1

我有一個JobItem對象,它裏面,我有:綁定列表框的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

是否有具有'JobItem'類的2個實例理由嗎?你不想用同一個嗎? – aqwert

+0

其實不是,我正在重新編輯我粘貼的代碼,感謝您注意,我現在就更新它。 – Erika

回答

4

我相信這是因爲你需要將DataContext設置爲父類。

businessUnitBox.DataContext = item; 

這是因爲你有以下結合

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

此外,您可以通過簡化具有約束力..

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

編輯:

如果你真的想

businessUnitBox.DataContext = item.BusinessUnit; 

那麼你的綁定需要是

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

但我使用item.BusinessUnit,而不是項目 – Erika

+0

DataContext是它找到的根級路徑。所以,如果您的示例中有Path =「BusinessUnit」,它會嘗試在ObersevableCollection上找到不存在的屬性 – aqwert

+0

哦對不起,我沒有閱讀正確的內容。這工作,謝謝! – Erika

相關問題