从Databound列表框传递Object而不是selectedIndex

时间:2010-12-13 01:41:48

标签: windows-phone-7

当我尝试从“列表”屏幕传递列表的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集合中的值,我一直在删除[index],然后重新添加到集合中。 那么有谁能告诉我,如何使用更新我的收藏中的现有元素?如果没有,我可以传递programId(在我的绑定中)而不是selectedIndex,因为在删除/添加功能之后索引会变得混乱。

请告知。

更新

在几个论坛发言后,我应该清楚我在我的对象中的属性上实现了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;
        }
    }

当我跑步时,一切看起来都没问题。

但是,当我导航到另一个页面时,我重新加载对象并且更改将丢失。这几乎就像我需要在导航之前保存它们,但是,如果我做一个item.Save();我的列表中有重复项。

2 个答案:

答案 0 :(得分:2)

我猜你还没有在你的Items类上实现INotifyPropertyChanged。

实现此功能将允许通过数据绑定更新这些对象中的更新。

以下是有关如何实现INotifyPropertyChanged的演练。

How to: Implement the INotifyPropertyChanged Interface

答案 1 :(得分:1)

类型为ObservableCollection<T>App.ViewModel.Items

如果是这样,当您修改其中一个集合项的属性并引发一个属性更改事件(via INotifyPropertyChanged),指示您的ListBox.ItemsSource绑定的集合属性时,DataTemplate绑定将执行其余操作