簡體   English   中英

如何在WPF中創建可綁定屬性?

[英]How to create a bindable property in WPF?

我有一個用戶控件。 我想在我的用戶控件中創建一個可綁定屬性。 我創建一個DependencyProperty如下:

public static readonly DependencyProperty DateProperty =
    DependencyProperty.Register("Date", typeof(DateTime), typeof(DaiesContainer), 
        new UIPropertyMetadata(DateTime.Now));

    public DateTime Date
    {
        get { return (DateTime)GetValue(DateProperty); }
        set
        {
            SetValue(DateProperty, value);
        }
    }

然后我在我的XAML中使用它:

<ctrls:DaiesContainer  Date="{Binding Date, Mode=OneWay}"/>

在我的ViewModel中,調用Date屬性的get方法。 但在我的用戶控件中,Date屬性未設置為值。

您的依賴項屬性實現缺少在PropertyChangedCallback值更改時調用的PropertyChangedCallback 回調被注冊為靜態方法,該方法將當前實例(屬性已更改)作為其第一個參數( DependencyObject類型)傳遞。 您必須將其強制轉換為類類型才能訪問實例字段或方法,如下面的show所示。

public static readonly DependencyProperty DateProperty =
    DependencyProperty.Register("Date", typeof(DateTime), typeof(DaiesContainer),
    new PropertyMetadata(DateTime.Now, DatePropertyChanged));

public DateTime Date
{
    get { return (DateTime)GetValue(DateProperty); }
    set { SetValue(DateProperty, value); }
}

private void DatePropertyChanged(DateTime date)
{
    //...
}

private static void DatePropertyChanged(
    DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    ((DaiesContainer)d).DatePropertyChanged((DateTime)e.NewValue);
}

另請注意,為類的所有實例僅設置一次依賴項屬性的默認值。 因此,設置DateTime.Now值將為所有這些值生成相同的默認值,即靜態DependencyProperty的注冊時間。 我想使用更有意義的東西,也許DateTime.MinValue ,將是一個更好的選擇。 由於MinValue已經是新創建的DateTime實例的默認值,您甚至可以省略屬性元數據中的默認值:

public static readonly DependencyProperty DateProperty =
    DependencyProperty.Register("Date", typeof(DateTime), typeof(DaiesContainer),
    new PropertyMetadata(DatePropertyChanged));

使你的綁定模式TwoWay

<ctrls:DaiesContainer  Date="{Binding Date, Mode=TwoWay}"/>

我認為你在XAML UserControl中有錯誤。

你應該通過ElementName綁定,例如:

<UserControl x:Class="WPFProject.DaiesContainer"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300"
             x:Name="daiesContainer">
    <Grid>
        <DatePicker SelectedDate="{Binding Date, ElementName=daiesContainer}" />
    </Grid>
</UserControl>

在這種情況下,您綁定到DaiesContainer類的Date屬性。

如果使用不帶ElementName綁定:

<DatePicker SelectedDate="{Binding Date}" />

UserControl DaiesContainer將嘗試在容器此用戶控件的DataContext中查找屬性Date ,如果找不到此屬性,您將看到DatePicker具有空的選定值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM