如何将childview的属性绑定到Xamarin Forms中当前viewmodel的属性

时间:2017-04-16 18:23:43

标签: c# binding xamarin.forms

我试图用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?

当我在iOS模拟器上运行时出现此异常: enter image description here

我现在试了好几个小时然后我想转过身去做我的&#34; selectedValue&#34;父类的一个可绑定属性,它也没有工作。我转向它也没有意义,因为我可以绑定到viewmodel的任何属性而不会使它们成为可绑定的属性,或者我在这里错了吗?

我是Xamarin.Forms的新手,我来自像Angular 2这样的技术,这样的东西就是直截了当。

请帮助

(目前我处于development process的第二阶段)

我已将代码上传到我的Git-Repo

2 个答案:

答案 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);

除了XAML解析异常之外,我没有像你提到的任何异常 sample image

答案 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构建自定义用户控件。