Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用不同的本机控件时,未在自定义渲染器中设置值_C#_Xaml_Uwp_Xamarin.forms_Custom Renderer - Fatal编程技术网

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显示旧日期或未选择但我没有看到所有时间时重置