我和WPF
玩了一段时间,我遇到了一个有趣的事情。当我将DateTime
对象绑定到Label
的内容时,我会看到日期的本地格式化表示。但是,当我绑定到TextBlock
的Text属性时,我实际上看到的是英文属性。
似乎TextBlock
正在使用某种转换器,而Label
只是调用ToString
方法,但我不确定。
如果是这样,为什么Label
也没有使用转换器?
有人可以向我解释为什么它按照它的方式工作?我提供了一个简短的样本,让你们检查一下发生了什么:
// MainWindow.xaml
<Window x:Class="BindConversion.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<StackPanel HorizontalAlignment="Center" Margin="3">
<StackPanel>
<Label Content="{Binding Dt}"/>
<TextBlock Text="{Binding Dt}"/>
</StackPanel>
</StackPanel>
</Window>
// MainWindow.xaml.cs
using System;
using System.Windows;
namespace BindConversion
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public DateTime Dt { get; set; }
public MainWindow()
{
InitializeComponent();
DataContext = this;
Dt = DateTime.Now;
}
}
}
答案 0 :(得分:2)
如果仔细查看Label
,您会看到它来自ContentControl
。
Content
属性由ContentPresenter
显示在文档中,其中包含以下内容:
如果有一个TypeConverter将Content的类型转换为UIElement,ContentPresenter将使用该TypeConverter并显示生成的UIElement。
现在有一个DateTimeConverter
继承自TypeConverter
,以下代码段生成的字符串与Label
完全相同:
var dateTimeConverter = new DateTimeConverter();
var convertToString = dateTimeConverter.ConvertToString(DateTime.Now);
<强>参考文献:强>
https://msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter(v=vs.110).aspx
https://msdn.microsoft.com/en-us/library/system.componentmodel.datetimeconverter(v=vs.110).aspx
答案 1 :(得分:1)
它们实际上是完全不同的野兽。
查看此内容以获取更多详细信息: https://joshsmithonwpf.wordpress.com/2007/07/04/differences-between-label-and-textblock/
标签实际上甚至不是控件