如何在WPF中创建可绑定属性?

时间:2013-07-13 11:54:47

标签: c# wpf binding

我有一个用户控件。我想在我的用户控件中创建一个可绑定属性。我按如下方式创建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属性未设置为值。

3 个答案:

答案 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已选中为空值。