gpt4 book ai didi

wpf - 默认转换器何时启动?

转载 作者:行者123 更新时间:2023-12-04 18:48:40 25 4
gpt4 key购买 nike

使用以下代码,虽然 Text 属性绑定(bind)到 DateTime 源属性,但我注意到 WPF 似乎会自动将文本转换为 DateTime,而无需我编写 ValueConverter。有人可以说明这是如何完成的吗

<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:WpfApplication1="clr-namespace:WpfApplication1"
Title="MainWindow" Height="350" Width="525"
>
<StackPanel>
<DatePicker Height="25" Name="datePicker1" Width="213" Text="{Binding Path=DueDate,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
</Window>

public class P
{
private DateTime? dueDate = DateTime.Now;
public DateTime? DueDate
{
get { return dueDate; }
set
{
dueDate = value;
}
}
}

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
P p = new P();
this.DataContext = p;
}
}

最佳答案

它正在使用 DateTimeTypeConverter来自基类库( 编辑: 好吧,它本可以使用 TypeConverter,但是从 @DeviantSeev's answer 看来他们没有)。

您所说的“默认”转换器实际上是 TypeConverters ( MSDN ) 并且它们自 v2.0 以来一直是 .NET Framework 的一部分,并且它们在整个基类库中都被使用。 WPF 中 TypeConverters 的另一个示例是 ThicknessTypeConverter对于 Padding , Margin , 和 BorderThickness特性。它将逗号分隔的字符串转换为 Thickness目的。

plentyarticles如果您愿意,可以使用 understand them further .

使用 TypeConverter 有两个部分- 类的实现,然后用 TypeConverterAttribute 标记你的属性/类型.

例如,我最近有一个需要 char[] 的自定义控件。我想从 Xaml 设置像这样:

<AutoCompleteTextBox MultiInputDelimiters=",;. " />

用法
[TypeConverter(typeof(CharArrayTypeConverter))]
public char[] MultiInputDelimiters
{
get { return (char[])GetValue(MultiInputDelimitersProperty); }
set { SetValue(MultiInputDelimitersProperty, value); }
}

实现
public class CharArrayTypeConverter : TypeConverter
{

public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
return (Type.GetTypeCode(sourceType) == TypeCode.String);
}

public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
if (value is string)
return ((string)value).ToCharArray();

return value;
}

}

何时使用 TypeConverter ?

您只能使用 TypeDescriptors如果您正在编写自定义控件,因为您需要能够使用 TypeDescriptorAttribute 标记属性.我也只会使用 TypeConverter如果转换相当简单 - 就像上面的例子中我有一个字符串并想要一个 char[] - 或者如果我想转换多种可能的格式。

你写 IValueConverter当您希望通过数据驱动或传递参数来更灵活地转换值时。例如,WPF 中一个非常常见的操作是转换 boolVisibility ;这种转换有三个可能的输出( VisibleHiddenCollapsed )并且只有两个输入( truefalse )很难在 TypeConverter 中决定这一点.

在我的应用程序中,为了实现这两个输入到三个输出的问题,我编写了一个 BoolToVisibilityConverterTrueValueFalseValue属性,然后在我的全局 ResourceDictionary 中实例化它三次.明天早上我会发布代码示例,我现在不在我面前..
[ValueConversion(typeof(bool), typeof(Visibility))]
public class BooleanToVisibilityConverter : IValueConverter
{
public Visibility FalseCondition { get; set; }
public Visibility TrueCondition { get; set; }

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return ((bool)value) ? TrueCondition : FalseCondition;
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if ((bool)value)
return TrueCondition;

return FalseCondition;
}
}

<converters:BooleanToVisibilityConverter x:Key="BoolToVisibilityConverter" FalseCondition="Collapsed" TrueCondition="Visible"/>
<converters:BooleanToVisibilityConverter x:Key="BoolToVisibilityCollapsedConverter" FalseCondition="Visible" TrueCondition="Collapsed"/>
<converters:BooleanToVisibilityConverter x:Key="BoolToVisibilityHiddenConverter" FalseCondition="Visible" TrueCondition="Hidden"/>
<converters:BooleanToVisibilityConverter x:Key="BoolToVisibilityHiddenWhenFalseConverter" FalseCondition="Hidden" TrueCondition="Visible"/>

关于wpf - 默认转换器何时启动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9624915/

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