c# – ContentControl.ContentTemplateSelector动态选择模板

前端之家收集整理的这篇文章主要介绍了c# – ContentControl.ContentTemplateSelector动态选择模板前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在Window的右边设置了一个ContentControl,并设置了内容绑定项(它的类型是ObservableCollection).现在我想实现它:如果没有项目,ContentControl选择第一个DataTemplate,并将项目添加到项目中,ContentControl将选择第二个DataTemplate来显示一些信息.

像这样:

问题是当我在项目中添加一个项目时,ContentControl没有更新和更改DataTemplate,我尝试设置模式,UpdateSourceTrigger等,但失败了.在viewmodel中,删除一个项目后,我使用这个语句,它将很好地工作< 1>:

  1. private void ExecuteDeleteClientCommand()
  2. {
  3. ...
  4. if (DeleteClient(item))
  5. {
  6. ObservableCollection<Myviewmodel> tmp = TabItems;
  7. TabItems = null;
  8. TabItems = tmp;
  9. }
  10. }

.

  1. <ContentControl
  2. ContentTemplateSelector="{StaticResource MyDataTemplateSelector}"
  3. Content="{Binding Items}"/>

.

  1. public class SingleClientDataTemplateSelector : DataTemplateSelector
  2. {
  3. public override DataTemplate SelectTemplate(object item,DependencyObject container)
  4. {
  5. ObservableCollection<Myviewmodel> obj =
  6. item as ObservableCollection<Myviewmodel>;
  7. if (null == obj || 0 == obj.Count)
  8. {
  9. return App.Current.FindResource("NullItemDataTemplate") as DataTemplate;
  10. }
  11. return App.Current.FindResource("DefaultDataTemplate") as DataTemplate;
  12. }
  13. }

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

  1. RaisePropertyChanging(ItemsPropertyName);
  2. RaisePropertyChanged(ItemsPropertyName);

但我想知道为什么它适用于< 1>.

Edited2
这是蜕变:

  1. public const string ItemsPropertyName = "Items";
  2. private ObservableCollection<Myviewmodel> items = new ObservableCollection<Myviewmodel>();
  3. public ObservableCollection<SingleClientDetailviewmodel> TabItems
  4. {
  5. get { return items; }
  6. set
  7. {
  8. if (items == value) { return;}
  9. RaisePropertyChanging(ItemsPropertyName);
  10. items = value;
  11. RaisePropertyChanged(ItemsPropertyName);
  12. }
  13. }

解决方法

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

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

  1. <ContentControl Content="{Binding Items}">
  2. <ContentControl.Style>
  3. <Style TargetType="ContentControl">
  4. <Setter Property="ContentTemplate" Value="{StaticResource DefaultDataTemplate}" />
  5. <Style.Triggers>
  6. <DataTrigger Binding="{Binding Path=Items}" Value="{x:Null}">
  7. <Setter Property="ContentTemplate" Value="{StaticResource NullItemDataTemplate}" />
  8. </DataTrigger>
  9. <DataTrigger Binding="{Binding Path=Items.Count}" Value="0">
  10. <Setter Property="ContentTemplate" Value="{StaticResource NullItemDataTemplate}" />
  11. </DataTrigger>
  12. </Style.Triggers>
  13. </Style>
  14. </ContentControl.Style>
  15. </ContentControl>

猜你在找的C#相关文章