Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于输入或加载的数据类型的控制类型开关_C#_Wpf_Controls - Fatal编程技术网

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

C# 基于输入或加载的数据类型的控制类型开关,c#,wpf,controls,C#,Wpf,Controls,我的UI中有一个字段,可以是日期或字符串 我想根据加载的数据或用户输入的数据打开显示的控件类型 换言之: DatePicker,如果用户开始输入一些数字(或加载的数据是日期) 文本框是字符串输入(或字符串加载) 找不到如何切换。如果你有小费,我会很高兴的。谢谢大家! 您需要根据类型使用模板。要做到这一点,您需要有两个属性,一个是属性类型,另一个是actial对象(都通知INotifyPropertyChanged) 您还可以创建一个转换器,该转换器将返回属性的类型,因此您可以删除其他属性(上

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

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

换言之:

  • 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>