我有一个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>
但没有变化,出现了类似的异常。
我需要知道:
答案 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)
错误的原因是什么?
CalendarDateRange
不是依赖属性。 我该如何解决?
DatePicker
控件以创建具有CalendarDateRangeDependency
属性的自定义DatePicker。或者,由于您提到代码背后,猜测您没有使用MVVM模式,只需在后面的代码中分配黑色日期。 当然推荐的模式是创建一个自定义DatePicker控件,其中包含黑暗日期的依赖项属性。
修改强>
您还可以创建attached依赖项属性,并将其用于日历停电日期。 如果您愿意,我将提供有关如何使用自定义DatePicker控件(更多编码)的代码,否则,您可以按照其他答案中提供的附加属性方式(更简单)进行操作。