![](/img/trans.png)
[英]How to create a DependancyProperty Collection with bindable Items in 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.