6

我有一个用户控件。我想在我的用户控件中创建一个可绑定属性。我创建一个 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 方法。但在我的用户控件中,日期属性未设置为值。

4

3 回答 3

9

您的依赖属性实现缺少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));
于 2013-07-14T10:18:44.833 回答
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将尝试在该用户控件的容器中查找属性DateDataContext如果找不到该属性,您将看到DatePicker选定的值为空。

于 2013-07-13T12:57:40.663 回答
0

使您的绑定模式双向

<ctrls:DaiesContainer  Date="{Binding Date, Mode=TwoWay}"/>
于 2013-07-13T12:01:07.427 回答