首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ContentControl.ContentTemplateSelector动态选择模板

ContentControl.ContentTemplateSelector动态选择模板
EN

Stack Overflow用户
提问于 2013-12-09 10:21:14
回答 1查看 13.6K关注 0票数 8

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

如下所示:

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

代码语言:javascript
复制
private void ExecuteDeleteClientCommand()
{
    ...
    if (DeleteClient(item))
    {
        ObservableCollection<MyViewModel> tmp = TabItems;
        TabItems = null;
        TabItems = tmp;
    }
}

代码语言:javascript
复制
<ContentControl 
    ContentTemplateSelector="{StaticResource MyDataTemplateSelector}" 
    Content="{Binding Items}"/>

代码语言:javascript
复制
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;
    }
}

编辑:删除一项后,使用此方式也失败:

代码语言:javascript
复制
RaisePropertyChanging(ItemsPropertyName);
RaisePropertyChanged(ItemsPropertyName);

但我不知道为什么它与<1>合作得很好。

Edited2这是delcaration:

代码语言:javascript
复制
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);
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-09 12:49:18

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

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

代码语言:javascript
复制
        <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>
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20468126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档