我有一个用户控件。我想在我的用户控件中创建一个可绑定属性。我按如下方式创建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属性未设置为值。
答案 0 :(得分:5)
您的依赖项属性实现缺少在属性值更改时调用的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));
答案 1 :(得分:1)
制作你的装订模式TwoWay
<ctrls:DaiesContainer Date="{Binding Date, Mode=TwoWay}"/>
答案 2 :(得分:0)
我认为你在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>
在这种情况下,您绑定到Date
类的DaiesContainer
属性。
如果您使用不带ElementName
的绑定:
<DatePicker SelectedDate="{Binding Date}" />
UserControl DaiesContainer
会尝试在此用户控件的Date
容器中找到属性DataContext
,如果找不到此属性,您会看到DatePicker
已选中为空值。