控件的默认数据模板

本文关键字:数据 默认 控件 | 更新日期: 2023-09-27 18:04:32

我正试图使一个属性编辑器,这将显示不同的数据类型的不同控制。

例如,如果数据是bool类型,那么它应该是一个复选框。如果它是一个颜色,它应该是一个颜色选择器。如果它是整型,它应该是一个数字上下等等。

对于其他的一切,它应该是一个文本框<——这是我挣扎的地方。

for bool I can do

<DataTemplate DataType="{x:Type mscorlib:Boolean}">
    <CheckBox IsChecked="{Binding Path=.}"/>
</DataTemplate>

,这是完美的。

但是我不知道如何使默认文本框的情况发生。

<DataTemplate>
    <TextBlock >
</DataTemplate>

将给我字典必须有一个Key属性错误

如果我添加一个键到模板,它不会被使用,除非我明确地做DataTemplate="..."

我似乎找不到一种方法为给定的模板目标多于一种类型。这迫使我一遍又一遍地复制粘贴模板,为我希望支持的每种类型。

有更好的方法吗?

控件的默认数据模板

最专业的方法是使用templateselector。

使用扩展wpf工具包中的IntegerUpDown控件来设置数值Up and down

使用扩展wpf工具箱的颜色选择器控件

包含在xaml

    xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"

          <DataTemplate x:Key="TEMPLATE">
                            <TextBox Text="{Binding Value, UpdateSourceTrigger=PropertyChanged}" />
                        </DataTemplate>
                        <DataTemplate x:Key="BOOLEANTEMPLATE">
                            <CheckBox IsChecked="{Binding Value, UpdateSourceTrigger=PropertyChanged}" />
                        </DataTemplate>
                  <DataTemplate x:Key="numericTemplate">
                       <xctk:IntegerUpDown Name="myUpDownControl" />
                    </DataTemplate>
                     <DataTemplate x:Key="ColorTemplate">
                        <xctk:ColorPicker></xctk:ColorPicker>
                    </DataTemplate>
                        <me:DynamicDataTemplateSelector        x:Key="datagridDynamictemplateselector"                                                     BooleanTemplate="{StaticResource BOOLEANTEMPLATE}"
ColorTemplate ="{StaticResource ColorTemplate}"
NumericTemplate ="{StaticResource numericTemplate}"
                                                        TextBoxTemplate="{StaticResource TEMPLATE}" />

下面是覆盖datatemplateselector类

的类
  public class DynamicDataTemplateSelector : DataTemplateSelector
        {
            public DataTemplate TextBoxTemplate{get;set;}
            public DataTemplate BooleanTemplate{get;set;}
            public DataTemplate NumericTemplate { get; set; }
            public DataTemplate ColorTemplate { get; set; }
            public override DataTemplate SelectTemplate(object item, DependencyObject container)
            {
                DataTemplate dataTemplate = TextBoxTemplate;
                  if(item!=null)
                  {                  
                      Type dataTypeOfValue = item.GetType();
                        if(dataTypeOfValue==typeof(int))
                       {
                           dataTemplate = NumericTemplate;
                       }
                       else if(dataTypeOfValue==typeof(Color))
                       {
                           dataTemplate = ColorTemplate;
                       }
                       else if (dataTypeOfValue == typeof(Boolean) || dataTypeOfValue == typeof(bool))
                        {
                            dataTemplate = BooleanTemplate;
                        }
                  }
                 return dataTemplate;
            }

我通过使用xaml样式+转换器解决了这个问题。

<ContentPresenter Content="{Binding MyValue}" 
    <ContentPresenter.Style>
         <Style TargetType="ContentPresenter">
               <Style.Setters>
                    <Setter Property="ContentTemplate">
                           <Setter.Value>
                                <DataTemplate>
                                     <TextBox Text="Dead beef"/>
                                </DataTemplate>
                           </Setter.Value>
                   </Setter>
               </Style.Setters>
         <Style.Triggers>
               <DataTrigger Binding="{Binding Path=., Converter={StaticResource ToTypeConverter}}" Value="{x:Type mscorlib:Boolean}">
                      <Setter Property="ContentTemplate">
                            <Setter.Value>
                                  <DataTemplate>
                                       <CheckBox IsChecked="{Binding Path=.}"/>
                                  </DataTemplate>
                            </Setter.Value>
                      </Setter>
                 </DataTrigger>
           </Style.Triggers>
       </Style>
   </ContentPresenter.Style>
</ContentPresenter>

转换器

public class ToTypeConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (value == null) ? null : value.GetType();
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
我们的想法是把默认模板放在style的ContentTemplate中,只修改使用style trigger的特殊模板。