2011-07-03 8 views
0

私のクラスでは、このようになりますItemsourceの変更に更新されない追加したときにコンボボックスは

<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は変更されていません。このライン:CoursesOfferedMAIN辞書のValuesプロパティ:

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

が、それは既にに割り当てられている値にItemsSourceを設定しています。値を変更していないので、コンボボックスは何もしません。

辞書のValuesプロパティは、とにかくItemsSourceとして使用することはお勧めできません。ディクショナリは予測可能な順序で値を保持しないため、UIでは本質的にランダムな順序で表示されます。

ValuesCollectionViewを作成することをお勧めします。 WPFのCollectionViewSourceオブジェクトはこれを行うために使用するオブジェクトです。 (CollectionViewSourceが必要な理由とその働きについては、Bea Stollnitz's articleを参照してください)CollectionViewが存在する場合は、それが基になっているコレクションを変更するたびにRefreshを呼び出すだけで、並べ替え/フィルタリングが行われますUIに通知する。

+0

Collectionviewは、データが1つまたは2つのクラスに制限されている場合に使用するのに適しています。しかし、この場合、多くのタイプがあり、ツリー階層のようになります。したがって、私はコレクションビュー私のために難しくなる。ありがとう@ロバート・ロスニー。非常に有益な投稿であり、状況が許せばこの情報を使用します。 – surpavan

+0

投稿したコード例は、1つのタイプのみを示しています。 –

+0

Rossney、残念ですが、他のクラスのほとんどは似ていますが、階層は約5レベルなので、コードの一部のみを追加しました。 – surpavan