如何将DateTime绑定为DependencyObject的DepedencyProperty,以便它将显示在文本框中?

时间:2013-02-02 15:12:03

标签: wpf wpf-controls

我想学习如何使用依赖对象和属性。我创建了这个类,

    public class TestDependency : DependencyObject
    {
        public static readonly DependencyProperty TestDateTimeProperty =
            DependencyProperty.Register("TestDateTime", 
            typeof(DateTime), 
            typeof(TestDependency), 
            new PropertyMetadata(DateTime.Now));

        public DateTime TestDateTime
        {
            get { return (DateTime) GetValue(TestDateTimeProperty); }
            set { SetValue(TestDateTimeProperty, value); }
        }
    }

窗口类就像这样

public partial class MainWindow : Window
{
    private TestDependency td;
    public MainWindow()
    {
        InitializeComponent();
        td = new TestDependency();
        td.TestDateTime = DateTime.Now;
    }
}

现在我想用它来显示TextBlock中的当前DateTime,它将自己更新 每秒 ,方法是将其添加到网格中

<Grid>
    <TextBlock Text="{Binding TestDateTime,ElementName=td}" Width="200" Height="200"/>
</Grid>

我可以看到TextBlock,但根本没有Date Time值。我做错了什么?

2 个答案:

答案 0 :(得分:2)

首先,如果您想要每秒更新一次显示时间,则需要定时器来触发更新。 DispatchTimer的工作原理很好。

public class TestDependency : DependencyObject
{
    public static readonly DependencyProperty TestDateTimeProperty =
        DependencyProperty.Register("TestDateTime", typeof(DateTime), typeof(TestDependency),
        new PropertyMetadata(DateTime.Now));

    DispatcherTimer timer;

    public TestDependency()
    {
        timer = new DispatcherTimer(new TimeSpan(0,0,1), DispatcherPriority.DataBind, new EventHandler(Callback), Application.Current.Dispatcher);
        timer.Start();

    }

    public DateTime TestDateTime
    {
        get { return (DateTime)GetValue(TestDateTimeProperty); }
        set { SetValue(TestDateTimeProperty, value); }
    }

    private void Callback(object ignore, EventArgs ex)
    {
        TestDateTime = DateTime.Now;
    }

}

接下来,我们需要修改XAML,以便它与更新的依赖项对象正确绑定。

<Window.DataContext>
    <local:TestDependency/>
</Window.DataContext>
<Grid>
    <TextBlock Text="{Binding TestDateTime}" />
</Grid>

由于我们在XAML中设置DataContext,您实际上可以删除MainWindow构造函数中代码背后的所有代码。

答案 1 :(得分:0)

如果您只想在TextBlock中显示某些值,则此处不需要依赖关系对象。尝试这样的事情:

public partial class MainWindow : Window
{
    public DateTime Test
    { get; set; }

    public MainWindow()
    {
        InitializeComponent();
        this.Test = DateTime.Now;
    }
}

<Grid>
    <TextBlock Text="{Binding Path=Test,RelativeSource={RelativeSource AncestorType=Window,Mode=FindAncestor}}"></TextBlock>
</Grid>

这里我没有显示可以每秒更新一次值的代码。我只想澄清一下,使用Dependency Property不是正确的情况。 当然,您可以使用Dependency Property来执行此操作。但是Dependency Object和Dependency Property可以为您提供一些扩展功能,例如Data Binding。但这并不意味着您需要使用依赖关系对象或依赖关系属性作为数据绑定的源。