我创建了一个基本上是评级控件的自定义控件。它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 不起作用,我已经尝试了一切。