我的UI中有一个可以采用日期或字符串的字段。
我想根据在那里加载或由用户输入的数据来打开显示的控件类型。
换句话说:
无法找到如何切换。如果你有一些提示,请高兴。谢谢!
答案 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设置为此日期。
所以我更新了上面的代码以反映这些变化。