2011-07-03 55 views
0

我的類看起來是這樣的:組合框不會的ItemSource變化更新

Public Class CoursesLib 
    Public CoursesOfferedMAIN As New Dictionary(Of String, Category) 
    Public Class Category 
     Private _CategoryName As String 
     Private _Deleted As Boolean 
     Public Courses As New Dictionary(Of String, Course) 
     Public Function Contains(ByVal CourseName As String) 
      For Each k As Course In Courses.Values 
       If k.CourseName = CourseName Then 
        Return True 
        Exit Function 
       End If 
      Next 
      Return False 
     End Function 
    End Class 
    Public Class Course 
     Private _CategoryName As String 
     Private _CourseID As String 
     Private _CourseName As String 
     Private _Deleted As Boolean 
     Public Sems As New Dictionary(Of String, Sem) 
     End Sub 
     Public Function Contains(ByVal find As String) 
      For Each k As Sem In Sems.Values 
       If k.SemName = find Then 
        Return True 
        Exit Function 
       End If 
      Next 
      Return False 
     End Function 
    End Class 
End Class 

以下是我在我的WPF使用XAML代碼:

<StackPanel Orientation="Horizontal" VerticalAlignment="Center" > 
      <TextBlock Text="Categories" Margin="0,0,10,0" Width="100" VerticalAlignment="Center" /> 
      <ComboBox Height="30" Name="CourseCategoryComboBox1" Width="120"> 
       <ComboBox.ItemTemplate> 
        <DataTemplate> 
         <Label Content="{Binding CategoryName}" /> 
        </DataTemplate> 
       </ComboBox.ItemTemplate> 
      </ComboBox> 
      <Button Name="AddNewCourseCategoryButton" Background="Transparent" Content="Add New" Foreground="#FF0994EB"/> 
     </StackPanel> 
     <StackPanel Orientation="Horizontal" Name="NewCategorySubmitStackPanel"> 
      <TextBlock Text="Name" Margin="0,0,10,0" Width="100" VerticalAlignment="Center" /> 
      <TextBox Height="30" Name="NewCourseCategoryTextBox1" Width="120" MaxLength="25"/> 
      <Button Name="SubmitNewCourseCategoryButton" Background="Transparent" Content="+" Margin="10,0,0,0" Foreground="#FF0994EB" FontWeight="Heavy" BorderBrush="Transparent" /> 
     </StackPanel> 
     <StackPanel Orientation="Horizontal" Name="CourseListStackPanel" > 
      <TextBlock Text="Course" Margin="0,0,10,0" Width="100" VerticalAlignment="Center" /> 
      <ComboBox Height="30" Name="CourseslistComboBox1" Width="120"> 
       <ComboBox.ItemTemplate> 
        <DataTemplate> 
         <Label Content="{Binding CourseName}"/> 
        </DataTemplate> 
       </ComboBox.ItemTemplate> 
      </ComboBox> 
      <Button Name="NewCourseButton" Background="Transparent" Content="Add New" Foreground="#FF0994EB"/> 
     </StackPanel> 
     <StackPanel Orientation="Horizontal" Name="NewCourseeSubmitStackPanel"> 
      <TextBlock Text="Name" Margin="0,0,10,0" Width="100" VerticalAlignment="Center" /> 
      <TextBox Height="24" Name="NewCourseeTextBox1" Width="120" MaxLength="25"/> 
      <Button Name="SubmitNewCourseButton" Background="Transparent" Content="+" Margin="10,0,0,0" Foreground="#FF0994EB" FontWeight="Heavy" BorderBrush="Transparent" /> 
     </StackPanel> 

的問題是,當加新的課程收集,combox沒有更新,但是當我重新啓動應用程序,它被添加,它不會插入時,我完成插入語句。以下是我使用的代碼。插入和更新控制:

If Not NewCourseeTextBox1.Text = "" Then 
     If Globals.Courses.CoursesOfferedMAIN(CType(CourseCategoryComboBox1.SelectedItem, WorkMateLib.CoursesLib.Category).CategoryName).Contains(NewCourseeTextBox1.Text) = False Then 
      Dim c As New WorkMateLib.CoursesLib.Course 
      c.Category = CType(CourseCategoryComboBox1.SelectedItem, WorkMateLib.CoursesLib.Category).CategoryName 
      c.CourseID = DateTime.UtcNow.ToString() 
      c.CourseName = NewCourseeTextBox1.Text 
      c.Deleted = False 
      Dim serv As New ServiceCourses.WCFCoursesClient 
      Dim ex As String 
      ex = serv.AddCourse(c) 
      If ex = "1" Then 
       NewCourseeTextBox1.Text = "" 
       NewCourseeSubmitStackPanel.Visibility = Windows.Visibility.Collapsed 
       Globals.Courses.CoursesOfferedMAIN(c.Category).Courses.Add(c.CourseID, c) 
       CourseslistComboBox1.ItemsSource = Globals.Courses.CoursesOfferedMAIN(c.Category).Courses.Values 
      Else 
       MessageBox.Show(ex) 
      End If 
     End If 
    End If 

謝謝。

+1

請在代碼塊中格式化您的代碼並指定語言標記以獲得正確的語法着色! –

+1

你在哪裏綁定/設置'ItemsSource'? – Zebi

+0

@Zebi我沒有使用任何綁定,我只是直接分配源。 – surpavan

回答

0

我嘗試了一些方法和所有後續工作他們的,是最簡單的一個,作爲我:

的竅門是在的ItemSource屬性,然後再指定列表或任何其他數據源改變什麼,通過這種方式,項目即時顯示沒有任何問題。 例如:

謝謝你的時間和幫助。

SubjectlistComboBox1.ItemsSource = Nothing 
         SubjectlistComboBox1.ItemsSource = Globals.Courses.CoursesOfferedMAIN(c.Category).Courses(c.CourseID).Sems(c.SemID).Subjects.Values 
1

字典不提供添加,刪除通知使用ObservableCollection(Of T)。

+0

你說的可能是對的,但我再次使用Itemsource,因此必須採取和更新新來源。 – surpavan

+0

什麼是你的綁定模式。 – anivas

+0

我沒有使用任何綁定,我直接分配了字典值。 – surpavan

1

你實際上並沒有改變ItemsSource。這條線:

CourseslistComboBox1.ItemsSource = Globals.Courses.CoursesOfferedMAIN(c.Category).Courses.Values 

ItemsSource設置爲它已經分配給值:CoursesOfferedMAIN字典的Values財產。由於您沒有更改該值,因此組合框不會執行任何操作。

無論如何,使用字典的Values屬性作爲ItemsSource並不是一個好主意。字典不會以可預測的順序維護它們的值,因此它們將以基本上隨機的順序出現在您的UI中。

您可能想要創建ValuesCollectionView。 WPF的CollectionViewSource對象是你用來做這件事的東西。 (有關CollectionViewSource需要以及它如何工作的原因,請參閱Bea Stollnitz's article)。一旦CollectionView存在,每次修改它所基於的集合時,您只需在其上調用Refresh,然後該視圖負責排序/篩選並通知用戶界面。

+0

Collectionview是一個好點,然後數據被限制爲1或2個類我的意思是層次結構,但是,在這種情況下,我有很多類型,他們也像樹層次結構,因此根據我的想法管理collectionview對我來說很難。謝謝@Robert Rossney。這是一篇非常翔實的文章,我會在情況允許時使用這些信息。 – surpavan

+0

您發佈的示例代碼只顯示一種類型。 –

+0

Rossney,對不起,我只添加了部分代碼,因爲大多數其他類都是相似的,但層次結構大約是5層深度,因此它是一個大的代碼發佈。 – surpavan

相關問題