wpf应用程序中的依赖属性问题

时间:2015-04-20 13:16:23

标签: c# wpf xaml binding dependency-properties

我有一个wpf应用程序,其中我想绑定不可绑定的属性

      <DatePicker HorizontalAlignment="Left" VerticalAlignment="Top" SelectedDate="{Binding DateP, Mode=TwoWay, UpdateSourceTrigger=LostFocus}">
                                        <DatePicker.BlackoutDates>
                                                <CalendarDateRange   view:Facturation.End="{Binding DateE1, Mode=TwoWay}"/>
                                                <CalendarDateRange   view:Facturation.Start="{Binding DateS1, Mode=TwoWay}"    view:Facturation.End="{Binding DateE2, Mode=TwoWay}"/>

                                        </DatePicker.BlackoutDates>
                                          </DatePicker>

在后面的代码中我添加了这个代码段:

 public partial class Facturation : UserControl
{
    public Facturation()
    {
        InitializeComponent();
    }
    public static readonly DependencyProperty StartProperty = DependencyProperty.Register("Start", typeof(DateTime), typeof(Facturation));
    public static readonly DependencyProperty EndProperty = DependencyProperty.Register("End", typeof(DateTime), typeof(Facturation));



    public DateTime End
    {

        get { return (DateTime)GetValue(EndProperty); }

        set { SetValue(EndProperty, value); }

    }

    public DateTime Start
    {

        get { return (DateTime)GetValue(StartProperty); }

        set { SetValue(StartProperty, value); }

    }
}

当我启动应用程序时,我遇到了这个例外:

  

无法设置&#39;绑定&#39;在物业&#39;结束&#39;类型&#39; CalendarDateRange&#39;。 A&#39;绑定&#39;只能在DependencyObject的DependencyProperty上设置。

修改

即使我创建了一个自定义日期选择器:

 class SpecialDatePicker: DatePicker
{
    public SpecialDatePicker()
    {

    }
    public static readonly DependencyProperty StartProperty = DependencyProperty.Register("Start", typeof(DateTime), typeof(SpecialDatePicker));
    public static readonly DependencyProperty EndProperty = DependencyProperty.Register("End", typeof(DateTime), typeof(SpecialDatePicker));
    public static readonly DependencyProperty CalendarDateRangeProperty = DependencyProperty.Register("CalendarDateRange ", typeof(CalendarDateRange), typeof(SpecialDatePicker));


    public DateTime End
    {

        get { return (DateTime)GetValue(EndProperty); }

        set { SetValue(EndProperty, value); }

    }

    public DateTime Start
    {

        get { return (DateTime)GetValue(StartProperty); }

        set { SetValue(StartProperty, value); }

    }

    public CalendarDateRange CalendarDateRange
    {

        get { return (CalendarDateRange)GetValue(CalendarDateRangeProperty); }

        set { SetValue(CalendarDateRangeProperty, value); }

    }
}

我改变了这样的xaml文件:

  <skin:SpecialDatePicker HorizontalAlignment="Left" VerticalAlignment="Top" SelectedDate="{Binding DateP, Mode=TwoWay, UpdateSourceTrigger=LostFocus}">
                                            <skin:SpecialDatePicker.BlackoutDates>
                                                <CalendarDateRange    End="{Binding DateE1, Mode=TwoWay}"/>
                                                <CalendarDateRange    Start="{Binding DateS1, Mode=TwoWay}"     End="{Binding DateE2, Mode=TwoWay}"/>

                                        </skin:SpecialDatePicker.BlackoutDates>

我得到了相同的结果。

EDIT2

正如@Rachel所说,我刚添加了这个转换器

 class DatesToBlackoutDateCollection : IMultiValueConverter 
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        CalendarBlackoutDatesCollection coll = new CalendarBlackoutDatesCollection(null);

        DateTime datDebut =(DateTime) values.Min() ;
         DateTime datFin =(DateTime) values.Max() ;

         coll.Add(new CalendarDateRange(datDebut,datFin));
        return coll;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        return (object[])value;
    }
}
Xaml文件中的

    <DatePicker.BlackoutDates>

                                                    <MultiBinding Converter="{StaticResource DatesToBlackoutDateCollection}">
                                                        <Binding Path="DateS1" />
                                                        <Binding Path="DateE2"/>
                                                    </MultiBinding>
 </DatePicker.BlackoutDates>

但没有变化,出现了类似的异常。

我需要知道:

  1. 出现此错误的原因是什么?
  2. 我该如何解决?

2 个答案:

答案 0 :(得分:1)

对象CalendarDateRange does not inherit from DependencyObject,因此它不参与WPF的绑定系统。这意味着您无法绑定任何属性。

我建议使用BlackoutDates绑定IMultiValueConverter属性,将日期转换为CalendarBlackoutDatesCollection

<DatePicker.BlackoutDates>
     <MultiBinding Converter="{StaticResource DatesToBlackoutDateCollection}"> 
           <Binding Path="DateE1" />
           <Binding Path="DateS1"/>
     </MultiBinding>
 </DatePicker.BlackoutDates>

或者,您可以尝试在DatePicker对象上创建附加属性,并使用后面的代码将数据传输到DatePicker.BlackoutDates属性。

答案 1 :(得分:0)

  1. 错误的原因是什么?

    • 您只能绑定到依赖项属性。 CalendarDateRange不是依赖属性。
  2. 我该如何解决?

    • 扩展现有的DatePicker控件以创建具有CalendarDateRangeDependency属性的自定义DatePicker。或者,由于您提到代码背后,猜测您没有使用MVVM模式,只需在后面的代码中分配黑色日期。
  3. 当然推荐的模式是创建一个自定义DatePicker控件,其中包含黑暗日期的依赖项属性。

    修改

    您还可以创建attached依赖项属性,并将其用于日历停电日期。 如果您愿意,我将提供有关如何使用自定义DatePicker控件(更多编码)的代码,否则,您可以按照其他答案中提供的附加属性方式(更简单)进行操作。