2013-07-13 30 views
3

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

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,日期屬性的get方法被調用。但在我的用戶控件中,Date屬性未設置爲值。

+0

你在[兼容模式(HTTP插入'DateTime'在XAML: //msdn.microsoft.com/en-us/library/dd631811.aspx)? –

+0

你怎麼知道房產沒有設置?您尚未使用依賴項屬性的元數據註冊[PropertyChangedCallback](http://msdn.microsoft.com/zh-cn/library/system.windows.propertychangedcallback.aspx)。請注意,在[XAML]中設置屬性時,CLR包裝器的設置器不會被調用,如[此處]所述(http://msdn.microsoft.com/zh-cn/library/bb613563.aspx)。 – Clemens

+0

@Clemens感謝這很好,但我必須調用非靜態方法。 –

回答

2

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

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)); 
0

讓你的綁定模式雙向

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

這不是工作。當我在C#中設置一個值爲date的屬性時,每件事情都很好,但是當我設置一個值到date的屬性時,xaml中的屬性沒有設置。 –

0

我認爲你在XAML用戶控件有錯誤。

你應該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> 

結合,例如:在這種情況下你DaiesContainerDate屬性綁定。在容器該用戶控件的DataContext

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

用戶控件DaiesContainer意志努力找物業Date,如果它不會找到這個屬性,你會看到DatePicker空選擇值:

如果你使用結合不ElementName