ContentControl.ContentTemplateSelector动态选择模板

时间:2013-12-09 10:21:15

标签: c# wpf mvvm contenttemplateselector

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

像这样:

enter image description here

问题是当我在项目中添加一个项目时,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);

但我想知道为什么它适用于&lt; 1&gt;

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);
    }
}

1 个答案:

答案 0 :(得分:10)

ContentControl只会监听PropertyChanged个事件,而不会监听CollectionChanged个事件。对于此行为,您需要使用ItemsControl或其他任何版本(如ListView)。

作为一种变通方法,您可以为Style而不是ContentControl创建TemplateSelector,在DataTrigger上定义Items.Count并设置{{ 1}}因此。 像,

ContentTemplate