与NotifyCollectionChangedAction连接的Expander View随机扩展项目

时间:2013-09-24 17:52:48

标签: c# xaml windows-phone-7 mvvm windows-phone-8

在我的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>

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

1 个答案:

答案 0 :(得分:0)

刷新清单是什么意思?

你想把一些新数据放入其中吗?如果是这样,就没有必要使用TrulyObser ......也不需要调用CollectionChanged。只需使用删除,添加,插入等方法即可。

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

如果要扩展扩展器,请在视图的代码隐藏中执行此操作。如果你想避免代码隐藏在VM中创建属性IsExpanded并将其绑定到Expander的IsExpanded属性。

您可以使用TrulyObservableCollection设置您的VM IsExpanded属性。当集合中某个项目发生变化时,它的IsExpanded为真。

反正。在大多数情况下,不需要“TrulyObservableCollection”