0

依存関係オブジェクトとプロパティの使用方法を学びたいです。私はこのクラスを作成しました、

    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は表示されますが、日時の値がまったく含まれていません。私は何が間違っているのですか?

4

2 に答える 2

2

まず、表示時間を1秒に1回更新する場合は、更新をトリガーするためのタイマーが必要になります。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コンストラクターのコードの背後にあるすべてのコードを実際に削除できます。

于 2013-02-02T15:46:56.347 に答える
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>

ここでは、毎秒値を更新できるコードを示していません。これは、依存関係プロパティを使用するのに適切な状況ではないことを明確にしておきたいと思います。もちろん、これを行うにはDependencyPropertyを使用できます。ただし、依存関係オブジェクトと依存関係プロパティは、データバインディングなどの拡張機能を提供できます。ただし、データバインディングのソースとして依存関係オブジェクトまたは依存関係プロパティを使用する必要があるという意味ではありません。

于 2013-02-02T15:56:51.507 に答える