2010-12-13 4 views
1

「リスト」画面からリストのselectedIndexを渡そうとすると問題が発生します。私のリスト画面でデータバインドされたリストボックスからselectedIndexではなくオブジェクトを渡す

私が結合した後があります後ろに

コード:

lbPrograms.ItemsSource = App.ViewModel.Items; 

をXAML:私の詳細画面で

<ListBox x:Name="lbPrograms" ItemsSource="{Binding Items}" SelectionChanged="lbPrograms_SelectionChanged"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel x:Name="DataTemplateStackPanel" Orientation="Horizontal"> 
        <Image x:Name="ItemImage" Source="/images/ArrowImg.png" Height="43" Width="43" VerticalAlignment="Top" Margin="10,0,20,0"/> 
        <StackPanel> 
         <TextBlock x:Name="ItemText" Text="{Binding programName}" Margin="-2,-13,0,0" Style="{StaticResource PhoneTextExtraLargeStyle}"/> 
         <TextBlock x:Name="DetailsText" Text="{Binding createDate}" Margin="0,-6,0,3" Style="{StaticResource PhoneTextSubtleStyle}"/> 
         <TextBlock x:Name="programId" Text="{Binding programId}" Margin="0,-6,0,3" Style="{StaticResource PhoneTextSubtleStyle}"/> 
        </StackPanel> 
        <!--<Image x:Name="ItemFavs" Source="/images/favs.png" Height="43" Width="43" VerticalAlignment="Top" Margin="10,0,20,0"/> 
        <Image x:Name="ItemDelete" Source="/images/delete.png" Height="43" Width="43" VerticalAlignment="Top" Margin="10,0,20,0"/>--> 
       </StackPanel> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

私が使用して見上げますselectedIndex値:

  App.ViewModel.Refresh(); 
      DataContext = App.ViewModel.Items[index].nValDictionary; 

しかし、iEnumerableコレクションの値を更新する方法がわからないので、私は[インデックス]を削除してからコレクションに追加し直しています。 だから誰でも私のコレクションの既存の要素をどのように更新するのか教えていただけますか?もしそうでなければ、インデックスがすべて削除/追加機能の後に乱れているので、selectedIndexの代わりにprogramId(私のバインディングにあります)を渡すことができます。

お願いします。

UPDATE:

いくつかのフォーラムで話すの後、私は私の物の私の性質上INotifyChangedイベントを実装していますことを解消すべきです。

基本的に以下のコードスニペットは、私の現在の問題である:

private void FavBtn_Click(object sender, EventArgs e) 
{ 
    foreach (var item in App.ViewModel.Items) 
    { 
     if ((item.currentProgram == true) && (item.programId != index)) 
     { 
      item.currentProgram = false; 
     } 

     if (item.programId == index) 
     { 
      item.currentProgram = true; 
     } 
    } 

私はこのすべてがOKになりそうだ実行します。

ただし、別のページに移動すると、オブジェクトを再度ロードしてオブジェクトを変更すると、変更内容が失われます。しかし、私がitem.Save()を実行すると、ナビゲートする前にそれらを保存する必要がほとんどあります。私は私のリストに重複を取得します。

答えて

2

あなたのItemsクラスにまだINotifyPropertyChangedを実装していないと思います。

これを実装すると、これらのオブジェクトの更新をデータバインディングを通じて更新できます。

ここでは、INotifyPropertyChangedを実装する方法について説明します。

How to: Implement the INotifyPropertyChanged Interface

+0

@Mick - そのウォークスルーをありがとう。実際には私のクラスでINotifyPropertyChangedを実装していましたが、私が従う例では保存イベントがありました...(http://onishimura.com/2010/07/25/windows-phone-7-tutorial - 作成 - 単純なメモ - アプリ付き - 銀色 - パート-1 /)私は毎回電話をかけます。クラスに保存する更新されたアイテムだけでなく、新しいアイテムを取得します。私は上の例にあるものを模倣するようにクラスを書き直して、それが違いを生むかどうかを確認します。ありがとう! – webdad3

+0

要件をアイテムを追加できるようにするには、リスト内のアイテムを更新するのではなく、コレクションにObservableCollectionを使用する必要があります。これは基本的にはコレクションのINotifyPropertyChangedです。 –

+0

@Mick ...対何?私はあなたが私に言っていることに従っていない。私はあなたを助けてくれてありがとう。 – webdad3

1

タイプObservableCollection<T>App.ViewModel.Itemsですか?

もしそうなら、コレクションアイテムの1つのプロパティを変更し、ListBox.ItemsSourceがバインドされているコレクションプロパティを示すプロパティ変更イベント(via INotifyPropertyChanged)を発生させると、DataTemplateバインディングが残ります。

+0

リンクをありがとう。私の上記のミックへのコメントを見てください。 – webdad3

関連する問題