0

我创建了一个基本上是评级控件的自定义控件。它CollectionView带有数字,当用户单击其中一个项目时,该项目被选中。为此,我创建了一个名为 的模型RatingModel,该模型包含:

  • RatingValue- 对应于项目值的整数,例如 0、1、2、3...
  • RatingName- 一个作为项目名称的字符串(现在我只使用整数 0、1、2,但我的想法是我可以使用其他名称,例如 Bad、Good、Excellent...
  • Color- 每个项目都有不同的颜色
  • IsChecked- 一个布尔值,表示选中的项目,如果为真,则表示项目被选中

然后,我使用引用此模型的模型视图创建了控件,该模型将 XAML 中的对应字段绑定到此控件。我还创建了一个BindableProperty以便RatingValue返回给调用此控件的人。我在Int32后面的代码中创建了一个并将其分配BindableProperty给这个值。

现在我想从父级(它是一个表单)调用这个控件,对于父级,我有这个控件的多个实例。对于父级,我创建了另一个模型,它将获取表单的每个条目(包括控件)。我已经将此父视图的上下文绑定到模型视图,并且它与任何其他组件都可以正常工作。但是,当我尝试使用Value="{Binding ThisValue}",(其中此值是父模型的字段)调用此控件时,我实际上无法取回该BindableProperty值。我这样打电话:

<Rating:RatingControl Value={Binding ThisValue, Mode=TwoWay} />

但是当我更改RatingValue控件内部的值时,ThisValue不会更新。为了测试它,我只是打印它的值:

<Label Text="{Binding ThisValue}"/>

这是我的控制类:

public partial class RatingControl : StackLayout
{
    public int Value
    {
        get { return (int)GetValue(ValueProperty); }
        set { SetValue(ValueProperty, value); }
    }

    public static readonly BindableProperty ValueProperty = BindableProperty.Create(
    propertyName: 'Value',
    returnType: typeof(int),
    declaringType: typeof(RatingControl),
    defaultValue: 0,
    defaultBindingMode: TwoWay,
    propertyChanged: ValueChanged);

    public static void ValueChanged(BindableObject bindable, object old, object new)
    {
        var control = bindable as RatingControl;
        control.Value = (int)new;
    }

    // I also have a event handler that changes value
    private void MyList_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        var obj = ((CollectionView)sender).SelectedItem;
        Value = ((myModel)obj).RatingValue;
     }
}

我不知道为什么这个 BindableProperty 不起作用,我已经尝试了一切。

4

0 回答 0