在我的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>
当我点击模拟器中的项目时,属性符号正在发生变化,但更多随机项目正在扩展。不知道为什么会这样。请帮帮我
答案 0 :(得分:0)
刷新清单是什么意思?
你想把一些新数据放入其中吗?如果是这样,就没有必要使用TrulyObser ......也不需要调用CollectionChanged。只需使用删除,添加,插入等方法即可。
项目模板自动获取为datacontext正确的集合元素。绑定工作正常。简单的INotifyCollectionChanged就足够了。
如果要扩展扩展器,请在视图的代码隐藏中执行此操作。如果你想避免代码隐藏在VM中创建属性IsExpanded并将其绑定到Expander的IsExpanded属性。
您可以使用TrulyObservableCollection设置您的VM IsExpanded属性。当集合中某个项目发生变化时,它的IsExpanded为真。
反正。在大多数情况下,不需要“TrulyObservableCollection”