gpt4 book ai didi

c# - 根据输入或加载的数据类型控制类型切换

转载 作者:太空宇宙 更新时间:2023-11-03 10:40:19 24 4
gpt4 key购买 nike

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

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

换句话说:

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

还没有找到如何切换。如果你有小费,我会很高兴。谢谢!

最佳答案

您需要根据类型使用模板。为此,您需要拥有 2 个属性,一个具有属性类型,另一个具有实际对象(均通知 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 绑定(bind)到您的属性并使用上面的转换器选择一个模板:

            <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 应该这样做。

编辑:我没有阅读第二部分,因此控件之间的切换应该在用户写入时发生。

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

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

所以我更新了上面的代码以反射(reflect)这些变化。

关于c# - 根据输入或加载的数据类型控制类型切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25562983/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com