我试图用xamarin形式构建一个自定义numpadcontrol,我想我在这里得到了一些完全错误,因为我工作的唯一结果就是令人困惑的异常。
这是我的numpad-views xaml:
<?xml version="1.0" encoding="UTF-8"?>
<ContentView xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="XFormsControls.Numpad">
<ContentView.Content>
<Grid>
<Label BackgroundColor="Silver" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="4" Text="{Binding Value}" HorizontalTextAlignment="End" />
<Button Grid.Row="1" Grid.RowSpan="2" Grid.Column="0" Text="+1" />
<Button Grid.Row="3" Grid.RowSpan="2" Grid.Column="0" Text="-1" />
<Button Grid.Row="1" Grid.Column="1" Text="1" />
<Button Grid.Row="1" Grid.Column="2" Text="2" />
<Button Grid.Row="1" Grid.Column="3" Text="3" />
<Button Grid.Row="2" Grid.Column="1" Text="4" />
<Button Grid.Row="2" Grid.Column="2" Text="5" />
<Button Grid.Row="2" Grid.Column="3" Text="6" />
<Button Grid.Row="3" Grid.Column="1" Text="7" />
<Button Grid.Row="3" Grid.Column="2" Text="8" />
<Button Grid.Row="3" Grid.Column="3" Text="9" />
<Button Grid.Row="4" Grid.Column="1" Text="Trash" />
<Button Grid.Row="4" Grid.Column="2" Text="0" />
<Button Grid.Row="4" Grid.Column="3" Text="Ok" />
</Grid>
</ContentView.Content>
</ContentView>
和我的numpad.xaml.cs:
public partial class Numpad : ContentView
{
private double? _value { get; set; }
public double? Value
{
get
{
return _value;
}
set
{
if (_value != value)
{
_value = value;
OnPropertyChanged();
}
}
}
public Numpad()
{
InitializeComponent();
BindingContext = this;
}
}
我希望能够从任何其他页面或视图加载此控件,并将控件的Value属性绑定到viewmodel的任何属性。所以我尝试将我的控件的Value属性设为Bindable Property,如下所示:
public static readonly BindableProperty valueProperty = BindableProperty.Create(
propertyName: "Value",
returnType: typeof(double),
declaringType: typeof(Numpad),
defaultValue: 0,
defaultBindingMode: BindingMode.TwoWay);
public double Value
{
get { return (double)GetValue(valueProperty); }
set
{
SetValue(valueProperty, value);
}
}
并尝试将其绑定到XAML中包含Page的属性,如下所示:
<local:Numpad Value="{Binding selectedValue}"></local:Numpad>
我的ContentPage的selectedValue属性定义如下(在代码隐藏中):
private double _selectedValue = 25;
public double selectedValue
{
get
{
return _selectedValue;
}
set
{
_selectedValue = value;
OnPropertyChanged();
}
}
在我的UWP-Localmachine调试中,它会抛出一个&#34; System.Reflection.TargetInvocationException&#34; (由调用的目标抛出)?? dafuq?
我现在试了好几个小时然后我想转过身去做我的&#34; selectedValue&#34;父类的一个可绑定属性,它也没有工作。我转向它也没有意义,因为我可以绑定到viewmodel的任何属性而不会使它们成为可绑定的属性,或者我在这里错了吗?
我是Xamarin.Forms的新手,我来自像Angular 2这样的技术,这样的东西就是直截了当。
请帮助
(目前我处于development process的第二阶段)
我已将代码上传到我的Git-Repo
答案 0 :(得分:0)
声明默认值可能导致问题,除此之外我没有看到任何差异。只是尝试更改下面的声明,希望有所帮助!
private static double defaultValue = 0;
public static readonly BindableProperty valueProperty = BindableProperty.Create(
propertyName: "Value",
returnType: typeof(double),
declaringType: typeof(Numpad),
defaultValue: defaultValue,
defaultBindingMode: BindingMode.TwoWay);
答案 1 :(得分:0)
所以这里有两件事是有问题的,首先,@ Dinesh kumar指出,我没有声明与实际属性同名的绑定属性,我写了valueProperty而不是ValueProperty。
第二个错误是在我的numpad的构造函数中设置BindingContext。我删除它并设置x:name =&#34;这个&#34;在我的numpad.xaml的顶部。感谢@AdamMeaney in the Xamarin Forum
他还发布了一篇非常usefull link to a example如何使用xamarin.forms构建自定义用户控件。