【问题标题】:Expander View connected with NotifyCollectionChangedAction randomly expands items与 NotifyCollectionChangedAction 连接的 Expander View 随机展开项目
【发布时间】:2013-09-24 17:52:47
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    刷新列表是什么意思?

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-29
      • 2017-11-21
      • 1970-01-01
      • 2014-10-13
      • 2019-04-16
      • 2023-04-07
      • 1970-01-01
      相关资源
      最近更新 更多