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

时间:2014-08-29 06:47:35

标签: c# wpf controls

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

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

换句话说:

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

无法找到如何切换。如果你有一些提示,请高兴。谢谢!

1 个答案:

答案 0 :(得分:2)

您需要根据类型使用模板。要做到这一点,你需要有2个属性,一个属性属性,另一个属性为actial对象(两者都通知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设置为string.Empty。然后在每次更改时使用DateTime.Parse检查输入的文本是否已经是日期。如果是,请将YourProperty设置为此日期。

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