将DataTemplateSelector应用于单个Item

时间:2012-01-18 12:29:53

标签: silverlight windows-phone-7

我创建了一个DataTemplateSelector类。我想将它应用于单个项目,因此它会根据某些条件选择模板。

基本上我希望在xaml中具有相同的功能:

% if myitem.A
  <TextBlock Text="{Binding myitem.data }"/>
% else if myitem.B
  <Button Content="{Binding myitem.data }"/>

 public class MyTemplateSelector : DataTemplateSelector
    {

        public DataTemplate A {
            get;
            set;
        }

        public DataTemplate B {
            get;
            set;
        }


        public override DataTemplate SelectTemplate(object item, DependencyObject container) {
            var myitem = item as MyItem;
            if (myitem.A)
               return A;
            else if (myitem.B)
               return B;
            return base.SelectTemplate(item, container);
        }

    }

我怎样才能做到这一点?

感谢。

1 个答案:

答案 0 :(得分:4)

如果您有一个项目而不是项目列表,则可以使用ContentPresenter和自定义ContentTemplate来显示此项目。如您所知,ContentTemplate可以使用您的TemplateSelector

       <ContentPresenter x:Name="control">
            <ContentPresenter.ContentTemplate>
                <DataTemplate>
                    <local:MyTemplateSelector Content="{Binding}">
                        <local:MyTemplateSelector.A>
                            <DataTemplate>
                                <TextBlock Text="null" />
                            </DataTemplate>
                        </local:MyTemplateSelector.A>
                        <local:MyTemplateSelector.B>
                            <DataTemplate>
                                <TextBlock Text="{Binding}" />
                            </DataTemplate>
                        </local:MyTemplateSelector.B>
                    </local:MyTemplateSelector>
                </DataTemplate>
            </ContentPresenter.ContentTemplate>
        </ContentPresenter>

这是我的TemplateSelector

public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        if (item == null)
            return A;

        return B;
    }

此行添加了一些要显示的内容:

control.Content = "123";