0

在我的 windows phone 8 应用程序中,我创建了真正可观察的集合,以便在集合中的项目更改时注意。这是收集代码:

public class TrulyObservableCollection<T> : ObservableCollection<T> where T : INotifyPropertyChanged
{
    public TrulyObservableCollection()
        : base()
    {
        CollectionChanged += new NotifyCollectionChangedEventHandler(TrulyObservableCollection_CollectionChanged);
    }

    void TrulyObservableCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.NewItems != null)
        {
            foreach (Object item in e.NewItems)
            {
                var test = item as INotifyPropertyChanged;
                (item as INotifyPropertyChanged).PropertyChanged += new PropertyChangedEventHandler(item_PropertyChanged);
            }
        }
        if (e.OldItems != null)
        {
            foreach (Object item in e.OldItems)
            {
                (item as INotifyPropertyChanged).PropertyChanged -= new PropertyChangedEventHandler(item_PropertyChanged);
            }
        }
    }

    void item_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        NotifyCollectionChangedEventArgs a = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset);
        OnCollectionChanged(a);

    }
}

我要描述的情况发生在两个控件上:扩展器视图(silverlight 工具包)和扩展器控件(telerik 控件)。在我看来,我有扩展器视图/控件的列表。在项目点击事件中,我想更改点击项目和刷新列表中的某些内容。这是我如何做的代码:

视图模型:

public TrulyObservableCollection<SymbolRecord> Symbols {get; set;}
private RelayCommand<SymbolRecord> tapCommand;
    public RelayCommand<SymbolRecord> TapCommand
    {
        get
        {
            return tapCommand ?? (tapCommand = new RelayCommand<SymbolRecord>((item) =>
            {

                item.Symbol = "test";

            }));
        }

    }

看法:

<telerikData:RadJumpList x:Name="ListControl" Grid.Row="1"IsCheckModeEnabled="False" GroupPickerItemTemplate="{StaticResource JumpListHeaderItemTemplate}"   GroupHeaderTemplate="{StaticResource JumpListHeaderTemplate}"  ItemsSource="{Binding Path=Symbols}"  >
<telerikData:RadJumpList.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <toolkit:ExpanderView ItemsSource="{Binding}" Expander="{Binding}"  VerticalAlignment="Stretch" VerticalContentAlignment="Stretch" ExpanderTemplate="{StaticResource ExpanderControlContentTemplate}" >
                        <toolkit:ExpanderView.Items> <TextBox Text="TEST"></TextBox></toolkit:ExpanderView.Items>
                    </toolkit:ExpanderView>                                
                </StackPanel>
            </DataTemplate>
</telerikData:RadJumpList.ItemTemplate>
</telerikData:RadJumpList>
 <i:Interaction.Triggers>
        <i:EventTrigger  EventName="ItemTap" SourceName="ListControl" >
            <cmd:EventToCommand  Command="{Binding TapCommand}" CommandParameter="{Binding SelectedItem,
                                      ElementName=ListControl}"  />
        </i:EventTrigger>
 </i:Interaction.Triggers>

当我在模拟器中单击项目时,属性 Symbol 正在发生变化,但更多的随机项目正在扩展。不知道为什么会这样。请帮我

4

1 回答 1

0

刷新列表是什么意思?

你想把一些新的数据放进去吗?如果是这样,则无需使用 TrulyObser... 也无需调用 CollectionChanged。只需使用删除、添加、插入等方法即可。

项目模板自动获取作为 datacontext 适当的集合元素。并且绑定工作正常。简单的 INotifyCollectionChanged 就足够了。

如果要扩展扩展器,请在视图的代码隐藏中进行。如果代码隐藏是您想要避免在 VM 中创建属性 IsExpanded 并将其绑定到 Expander 的 IsExpanded 属性的东西。

您可以使用该 TrulyObservableCollection 设置您的 VM IsExpanded 属性。当集合中的一项更改设置时,它的 IsExpanded 为 true。

无论如何。在大多数情况下,不需要“TrulyObservableCollection”

于 2013-09-24T20:40:48.057 回答