基于输入或加载的数据类型的控制类型开关
本文关键字:数据类型 控制 类型 开关 加载 于输入 输入 | 更新日期: 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设置为此日期。
所以我更新了上面的代码来反映这些变化。