GridViewDataColumn的动态DataTemplate

时间:2015-09-28 13:57:27

标签: wpf

目前我有两个专栏。第一列是组合框类型,可以是电话或电子邮件。第二列是价值。我目前有两个数据模板,一个用于带有掩码的手机类型。如果是电子邮件,它是一个没有掩码的常规文本框。请问如何让它变得动态?

<DataTemplate x:Key="PhoneMaskTemplate">
     <Telerik:RadMaskedTextBox BorderBrush="Transparent"
                               HorizontalAlignment="Left"
                               Mask="(###) ###-#### x####" 
                               MaskedText="{Binding Value, Mode=TwoWay}" >
      </Telerik:RadMaskedTextBox>
</DataTemplate>

<DataTemplate x:Key="NoMaskTemplate">
     <TextBox Text="{Binding Value, Mode=TwoWay}" BorderBrush="Transparent" HorizontalAlignment="Left" Margin="-2,0,0,0">
     </TextBox>
</DataTemplate>

<Telerik:GridViewDataColumn Header="Value" Width="*" 
                            DataMemberBinding="{Binding Value}" 
/>

1 个答案:

答案 0 :(得分:1)

您可以实施自定义-Ddependency.locations.enabled=false,您可以在DataTemplateSelector属性中设置。

Telerilk:GridViewDataColumn.CellTemplateSelector

然后你有:

public class MyDataTemplateSelector : DataTemplateSelector
{
    public DataTemplate EmailTemplate { get; set; }

    public DataTemplate PhoneTemplate { get; set; }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
       if(IsPhone(item))
           return PhoneTemplate;
       else if(IsEmail(item))
           return EmailTemplate;
       else
           return base.SelectTemplate(item, container);
    }
}

你的专栏:

<local:MyDataTemplateSelector x:Key="TemplateSelector" 
                              PhoneTemplate="{StaticResource PhoneMaskTemplate}" 
                              EmailTemplate="{StaticResource NoMaskTemplate}" />

您应该只能正确实施<Telerik:GridViewDataColumn Header="Value" Width="*" DataMemberBinding="{Binding Value}" CellTemplateSelector="{StaticResource TemplateSelector}" /> IsPhone方法。