我在Window的右边设置了一个ContentControl,并设置了内容绑定项(它的类型是ObservableCollection).现在我想实现它:如果没有项目,ContentControl选择第一个DataTemplate,并将项目添加到项目中,ContentControl将选择第二个DataTemplate来显示一些信息.
像这样:
问题是当我在项目中添加一个项目时,ContentControl没有更新和更改DataTemplate,我尝试设置模式,UpdateSourceTrigger等,但失败了.在viewmodel中,删除一个项目后,我使用这个语句,它将很好地工作< 1>:
- private void ExecuteDeleteClientCommand()
- {
- ...
- if (DeleteClient(item))
- {
- ObservableCollection<Myviewmodel> tmp = TabItems;
- TabItems = null;
- TabItems = tmp;
- }
- }
.
- <ContentControl
- ContentTemplateSelector="{StaticResource MyDataTemplateSelector}"
- Content="{Binding Items}"/>
.
- public class SingleClientDataTemplateSelector : DataTemplateSelector
- {
- public override DataTemplate SelectTemplate(object item,DependencyObject container)
- {
- ObservableCollection<Myviewmodel> obj =
- item as ObservableCollection<Myviewmodel>;
- if (null == obj || 0 == obj.Count)
- {
- return App.Current.FindResource("NullItemDataTemplate") as DataTemplate;
- }
- return App.Current.FindResource("DefaultDataTemplate") as DataTemplate;
- }
- }
编辑:
使用这种方式删除一项后也失败:
- RaisePropertyChanging(ItemsPropertyName);
- RaisePropertyChanged(ItemsPropertyName);
但我想知道为什么它适用于< 1>.
Edited2
这是蜕变:
- public const string ItemsPropertyName = "Items";
- private ObservableCollection<Myviewmodel> items = new ObservableCollection<Myviewmodel>();
- public ObservableCollection<SingleClientDetailviewmodel> TabItems
- {
- get { return items; }
- set
- {
- if (items == value) { return;}
- RaisePropertyChanging(ItemsPropertyName);
- items = value;
- RaisePropertyChanged(ItemsPropertyName);
- }
- }
解决方法
ContentControl将仅侦听PropertyChanged事件,而不侦听CollectionChanged事件.您需要使用ItemsControl或其他任何版本(如ListView)来执行此操作.
作为解决方法,您可以为ContentControl创建样式,而不是TemplateSelector,在Items.Count上定义DataTrigger并相应地设置ContentTemplate.
就像是,
- <ContentControl Content="{Binding Items}">
- <ContentControl.Style>
- <Style TargetType="ContentControl">
- <Setter Property="ContentTemplate" Value="{StaticResource DefaultDataTemplate}" />
- <Style.Triggers>
- <DataTrigger Binding="{Binding Path=Items}" Value="{x:Null}">
- <Setter Property="ContentTemplate" Value="{StaticResource NullItemDataTemplate}" />
- </DataTrigger>
- <DataTrigger Binding="{Binding Path=Items.Count}" Value="0">
- <Setter Property="ContentTemplate" Value="{StaticResource NullItemDataTemplate}" />
- </DataTrigger>
- </Style.Triggers>
- </Style>
- </ContentControl.Style>
- </ContentControl>