基于输入或加载的数据类型的控制类型开关

本文关键字:数据类型 控制 类型 开关 加载 于输入 输入 | 更新日期: 2023-09-27 18:19:52

我的UI中有一个字段,可以是日期或字符串。

我想根据加载的数据或用户输入的数据来打开显示的控件类型。

换句话说:

  • DatePicker,如果用户开始输入一些数字(或者加载的数据是日期)
  • TextBox是一个字符串输入(或加载的字符串)

还找不到如何切换。如果你有小费,我很高兴。非常感谢。

基于输入或加载的数据类型的控制类型开关

您需要根据类型使用模板。要做到这一点,您需要有两个属性,一个具有属性类型,另一个具有活动对象(均通知INotifyPropertyChanged)。

    public object YourProperty
    {
        get
        {
            return yourProperty;
        }
        set
        {
            yourProperty = value;
            OnPropertyChanged();
            DateTime date;
            if(yourProperty is String && DateTime.TryParse((string) yourProperty, out date))
            {
                YourProperty = date;
            }
        }
    }
    private object yourProperty = string.Empty;
//public Type YourPropertyType { get; set; }

你也可以创建一个转换器,它将返回属性的类型,这样你就可以去掉额外的属性(上面评论了):

public class TypeOfConverter : MarkupExtension, IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return (value == null) ? null : value.GetType();
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }
}

最后,将ContentControl绑定到您的属性,并使用上面的转换器选择一个模板:

            <ContentControl Content="{Binding YourProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
                <ContentControl.Resources>
                    <Style TargetType="ContentControl">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Path=YourProperty,Converter={flowMathTest:TypeOfConverter}}" Value="{x:Type system:DateTime}">
                                <Setter Property="ContentTemplate">
                                    <Setter.Value>
                                        <DataTemplate>
                                            <DatePicker SelectedDate="{Binding Content, RelativeSource={RelativeSource AncestorType=ContentControl}, UpdateSourceTrigger=PropertyChanged}"/>
                                        </DataTemplate>
                                    </Setter.Value>
                                </Setter>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding Path=YourProperty,Converter={flowMathTest:TypeOfConverter}}" Value="{x:Type system:String}">
                                <Setter Property="ContentTemplate">
                                    <Setter.Value>
                                        <DataTemplate>
                                            <TextBox Text="{Binding Content, RelativeSource={RelativeSource AncestorType=ContentControl}, UpdateSourceTrigger=PropertyChanged}"/>
                                        </DataTemplate>
                                    </Setter.Value>
                                </Setter>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </ContentControl.Resources>
            </ContentControl>

Thant应该这么做。

编辑:我没有读第二部分,所以控件之间的切换应该在用户写入时进行。

在这种情况下,您可以将绑定更改为Mode=TwoWay和UpdateSourceTrigger=PropertyChanged,并处理代码中类型的检测。

默认情况下,将YourProperty设置为字符串。空的然后在每次更改时,使用DateTime.Parse检查输入的文本是否已经是日期。如果是,请将YourProperty设置为此日期。

所以我更新了上面的代码来反映这些变化。