C# 基于输入或加载的数据类型的控制类型开关
我的UI中有一个字段,可以是日期或字符串 我想根据加载的数据或用户输入的数据打开显示的控件类型 换言之:C# 基于输入或加载的数据类型的控制类型开关,c#,wpf,controls,C#,Wpf,Controls,我的UI中有一个字段,可以是日期或字符串 我想根据加载的数据或用户输入的数据打开显示的控件类型 换言之: DatePicker,如果用户开始输入一些数字(或加载的数据是日期) 文本框是字符串输入(或字符串加载) 找不到如何切换。如果你有小费,我会很高兴的。谢谢大家! 您需要根据类型使用模板。要做到这一点,您需要有两个属性,一个是属性类型,另一个是actial对象(都通知INotifyPropertyChanged) 您还可以创建一个转换器,该转换器将返回属性的类型,因此您可以删除其他属性(上
- DatePicker,如果用户开始输入一些数字(或加载的数据是日期)
- 文本框是字符串输入(或字符串加载)
找不到如何切换。如果你有小费,我会很高兴的。谢谢大家! 您需要根据类型使用模板。要做到这一点,您需要有两个属性,一个是属性类型,另一个是actial对象(都通知INotifyPropertyChanged) 您还可以创建一个转换器,该转换器将返回属性的类型,因此您可以删除其他属性(上面已注释): 最后,将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>
他不应该这样做
编辑:我没有阅读第二部分,所以控件之间的切换应该在用户写入时发生
在这种情况下,您可以将绑定更改为Mode=TwoWay和UpdateSourceTrigger=PropertyChanged,并处理代码中类型的检测
默认情况下,将YourProperty设置为string.Empty。然后在每次更改时,使用DateTime.Parse检查输入的文本是否已经是date。如果是,请将您的属性设置为此日期
因此,我更新了上面的代码以反映这些更改。这可能与主题无关,但我很好奇。。。您的用户是否清楚他们可以做这件事?这听起来有点像一场可用性噩梦,用户可以开始以他们想要的格式(即2014年8月29日)输入日期,但由于您的日期格式无法识别该日期,因此它被视为一个字符串。至少我建议只使用单选按钮来决定输入格式嗨,是的,这是一个非常有效的问题。我正试图把这些放在一起,使界面上的点击次数最少。希望首先向用户显示日期选择器将促使他同时执行这两项操作。将查看这是否适用于他们,如果不适用,则只按建议执行一个单选按钮。通过将默认输入方法设置为日期选择器,您不会向用户引入任何额外的单击。在大多数情况下,用户不会介意多点击几下,为他们提供一种更适合他们的方法(当然,我没有证据证明这一点,这就是用户测试发挥作用的地方)嗨,也非常感谢你的回答,非常感谢。由于我需要测试它并花费一些时间,所以还没有投票认为它是正确的。很快就会恢复。干杯
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 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>