c# – ContentControl.ContentTemplateSelector动态选择模板
发布时间:2020-12-15 08:37:07 所属栏目:百科 来源:网络整理
导读:我在Window的右边设置了一个ContentControl,并设置了内容绑定项(它的类型是ObservableCollection).现在我想实现它:如果没有项目,ContentControl选择第一个DataTemplate,并将项目添加到项目中,ContentControl将选择第二个DataTemplate来显示一些信息. 像这样
我在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> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |