ContentControl.ContentTemplateSelector动态选择模板

我在Window右侧设置了一个ContentControl,并设置了内容绑定项(它的类型是ObservableCollection)。 现在我想实现它:如果没有项目,ContentControl选择第一个DataTemplate,并将项目添加到项目中,ContentControl将选择第二个DataTemplate来显示一些信息。

像这样:

在此处输入图像描述

问题是当我在项目中添加一个项目时,ContentControl没有更新和更改DataTemplate,我尝试设置模式,UpdateSourceTrigger等,但失败了。 在ViewModel中,删除一个项目后,我使用这个语句,它会很好用

private void ExecuteDeleteClientCommand() { ... if (DeleteClient(item)) { ObservableCollection tmp = TabItems; TabItems = null; TabItems = tmp; } } 

  

 public class SingleClientDataTemplateSelector : DataTemplateSelector { public override DataTemplate SelectTemplate(object item, DependencyObject container) { ObservableCollection obj = item as ObservableCollection; if (null == obj || 0 == obj.Count) { return App.Current.FindResource("NullItemDataTemplate") as DataTemplate; } return App.Current.FindResource("DefaultDataTemplate") as DataTemplate; } } 

编辑:使用这种方式删除一项后也失败:

 RaisePropertyChanging(ItemsPropertyName); RaisePropertyChanged(ItemsPropertyName); 

但我想知道为什么它适用于

Edited2这是蜕变:

 public const string ItemsPropertyName = "Items"; private ObservableCollection items = new ObservableCollection(); public ObservableCollection TabItems { get { return items; } set { if (items == value) { return;} RaisePropertyChanging(ItemsPropertyName); items = value; RaisePropertyChanged(ItemsPropertyName); } } 

ContentControl将仅侦听PropertyChanged事件,而不侦听CollectionChanged事件。 您需要使用ItemsControl或其他任何版本(如ListView来执行此操作。

作为解决方法,您可以为ContentControl创建Style ,而不是TemplateSelector ,在DataTrigger上定义Items.Count并相应地设置ContentTemplate 。 就像是,