C# 使用不同的本机控件时,未在自定义渲染器中设置值
基本上,我使用的是来自的C# 使用不同的本机控件时,未在自定义渲染器中设置值,c#,xaml,uwp,xamarin.forms,custom-renderer,C#,Xaml,Uwp,Xamarin.forms,Custom Renderer,基本上,我使用的是来自的DatePicker的自定义渲染器实现。现在我想为UWP提供一个自定义渲染器。因此,我在UWP上交换控件,并希望改用CalendarDatePicker 基本上,属性Date和NullableDate应该相同(除了NullableDate为null的情况)。因此有一个同步(有时设置属性的频率太高,但这是另一回事)。我现在的经验是,Date的值总是错误的。大多数情况下,它具有默认值,即当前日期(或其值为01.01.0001)。该值似乎无法更改,因为在调试模式下,它在更改为新
DatePicker
的自定义渲染器实现。现在我想为UWP提供一个自定义渲染器。因此,我在UWP上交换控件,并希望改用CalendarDatePicker
基本上,属性Date
和NullableDate
应该相同(除了NullableDate
为null的情况)。因此有一个同步(有时设置属性的频率太高,但这是另一回事)。我现在的经验是,Date
的值总是错误的。大多数情况下,它具有默认值,即当前日期(或其值为01.01.0001)。该值似乎无法更改,因为在调试模式下,它在更改为新值后仍具有相同的值。由于同步的原因,NullableDate
在一次获得正确的值之后,也会得到错误的值。要使自定义渲染器工作,还需要订阅DateChanged
事件
以下是我当前的实现,它显示了一个完全工作的项目:
MainPage.xaml
年月日
0001年1月1日
MainPage.xaml.cs
public分部类主页面:ContentPage
{
公共主页()
{
初始化组件();
}
ShowButtonClicked上的私有void(对象发送方,事件参数e)
{
System.Diagnostics.Debug.WriteLine(“日期:“+this.dateOfBirth.Date”);
System.Diagnostics.Debug.WriteLine(“NullableDate:+this.dateOfBirth.NullableDate”);
返回;
}
私有void OnClearButtonClicked(对象发送方,事件参数e)
{
this.dateOfBirth.NullableDate=null;
}
}
ExtendedDatePicker.cs
public类ExtendedDatePicker:DatePicker
{
公共静态只读BindableProperty NullableDateProperty=
Create(“NullableDate”,typeof(DateTime?),typeof(ExtendedDatePicker),null,BindingMode.TwoWay);
公共日期时间?NullableDate
{
获取{return(DateTime?)GetValue(NullableDateProperty);}
设置
{
如果(值!=NullableDate)
{
SetValue(NullableDateProperty,value);
UpdateDate();
}
}
}
受保护的覆盖无效OnBindingContextChanged()
{
base.OnBindingContextChanged();
UpdateDate();
}
受保护的重写无效OnPropertyChanged(字符串propertyName=null)
{
base.OnPropertyChanged(propertyName);
如果(propertyName==DateProperty.propertyName)
{
如果(日期!=默认值(日期时间))
{
NullableDate=日期;
}
其他的
{
NullableDate=null;
}
}
if(propertyName==NullableDateProperty.propertyName)
{
if(NullableDate.HasValue&&Date!=NullableDate.Value)
{
日期=NullableDate.Value;
}
}
}
私有void UpdateDate()
{
if(NullableDate.HasValue)
{
日期=NullableDate.Value;
}
其他的
{
日期=(DateTime)DateProperty.DefaultValue;
//日期=默认值(日期时间);
}
}
}
ExtendedDatePickerRenderer.cs
公共类ExtendedDatePickerRenderer:ViewRenderer
{
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
var view=作为ExtendedDatePicker的元素;
if(e.OldElement!=null | | view==null)
返回;
var calendarDatePicker=新的calendarDatePicker();
calendarDatePicker.DateChanged+=calendarDatePicker\u DateChanged;
SetNativeControl(日历日期选择器);
SetNullableText(视图);
}
私有void CalendarDatePicker\u DateChanged(CalendarDatePicker发件人、CalendarDatePickerDateChangedEventArgs参数)
{
var view=this.Element作为ExtendedDatePicker;
if(args.NewDate.HasValue)
{
DateTime newDate=args.newDate.GetValueOrDefault().LocalDateTime.Date;
view.NullableDate=newDate;
}
}
受保护的覆盖无效OnElementPropertyChanged(对象发送方,PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(发送方,e);
变量视图=(ExtendedDatePicker)元素;
if(e.PropertyName==ExtendedDatePicker.NullableDateProperty.PropertyName)
SetNullableText(视图);
}
私有void SetNullableText(ExtendedDatePicker视图)
{
if(view.NullableDate==null)
Control.Date=null;
}
}
如果
Date
的值与NullableDate
的值相同,我需要更改什么?该值应表示在日期选择器中选择的值。还应该可以重置为默认值。我无法复制该值。这似乎对我有用。您是否使用了showButton
打印值?一个测试用例:1。打印2。重置3。打印4。设置日历日期选择器5。打印6<代码>清除按钮
7。印刷品。我成功地使用了NullableDate
,但为什么Date
是错误的呢?你是怎么测试的?在设备上还是在Windows计算机上?您使用哪个Windows版本?我正在Windows 10本地计算机上测试。我将断点放在ExtendedDatePicker的UpdateDate中,并从具有正确值的NullableDate的渲染器中获得调用。单击的显示按钮也会显示正确的值。我将使用DateSelected事件,而不是您正在使用的许多属性,包括渲染器中的DateSelected。我看到的唯一问题是当值正确但UI显示旧日期或未选择但我没有看到所有时间时重置