Xamarin Forms 使用 Reflexion 获得 属性 of Bindable 属性

Xamarin Forms Using Reflexion to get Property of Bindable Property

我想要的是,当值更改时,它应该调用 CreateChart() 并使用新值。 我尝试调用一个 on属性Change 方法 OnValueChanged 一个可绑定的 属性 与反射,但是 属性 总是空的,我没有得到 [=23 的值=] Value

public partial class CorrectWrongRingChart : ContentView
    {
        public CorrectWrongRingChart()
        {
            InitializeComponent();
            
            
        }
        
        public static readonly BindableProperty ChartProperty =
            BindableProperty.Create(
                nameof(CorrectWrongChart),
                typeof(Chart),
                typeof(CorrectWrongRingChart));

        public Chart CorrectWrongChart
        {
            get { return (Chart)GetValue(ChartProperty); }
            set => SetValue(ChartProperty, value);
        }

        public static readonly BindableProperty ValueProperty =
          BindableProperty.Create(
              nameof(Value),
              typeof(CorrectWrongValue),
              typeof(CorrectWrongRingChart),
              propertyChanged: OnValueChanged);/*(b, o, n) => { ((CorrectWrongRingChart)b).OnPropertyChanged("Text");});*/

        public  CorrectWrongValue Value
        {
            get { return (CorrectWrongValue)GetValue(ValueProperty); }
            set => SetValue(ValueProperty, value);
        }

        private static void OnValueChanged(BindableObject bindable, object oldValue, object newValue)
        {
             ((CorrectWrongRingChart)bindable).OnPropertyChanged("Text");            
             //((CorrectWrongRingChart)bindable).OnPropertyChanged("Correct"); 
             //((CorrectWrongRingChart)bindable).OnPropertyChanged("Wrong");
            var valueProperty = ValueProperty.GetType().GetProperty("Value");
            var value = (CorrectWrongValue)valueProperty.GetValue("Value");
            var ChartProperty = ValueProperty.GetType().GetProperty("CorrectWrongChart");
            
            if (value != null)
            {

                ChartProperty.SetValue("CorrectWrongChart", CreateChart(value));
                
            }
            
            

        }

        public static readonly BindableProperty TextProperty =
            BindableProperty.Create(
                nameof(Text),
                typeof(string),
                typeof(CorrectWrongRingChart),
                defaultValue: string.Empty);

        public string Text => $"{Value?.CorrectCount ?? 0}/{Value?.TotalCount ?? 0}";
        //public double Correct => Value.CorrectPercentage;
        //public  double Wrong => Value.WrongPercentage;


        private static Chart CreateChart(CorrectWrongValue value)
        {
            var chart = new Microcharts.DonutChart();
            chart.IsAnimated = false;
            
            ChartEntry corretEntry = new ChartEntry((float)value.CorrectPercentage)
            {
                Color = SKColor.Parse("#00FF00")
            };
            ChartEntry wrongEntry = new ChartEntry((float)value.WrongPercentage)
            {
                Color = SKColor.Parse("#FF0000")
            };
            chart.Entries = new List<ChartEntry>() { corretEntry, wrongEntry };
            return chart;
        }
    }

Xaml:

<Grid >
            <forms:ChartView x:Name="chart1" WidthRequest="130" HeightRequest="130" Chart="{Binding CorrectWrongChart, Source={x:Reference Root}}">
               
</forms:ChartView>
            <Label Text="{ Binding Text, Source={x:Reference Root} }"                  
                   VerticalOptions="Center"
                   HorizontalOptions="Fill"
                   HorizontalTextAlignment="Center"
                   TextColor="Black"
                   FontSize="19"
                   FontFamily="{ StaticResource AppBoldFontFamily }" />
        </Grid>

如果你想在值改变的时候得到Value,你可以像下面这样直接得到

private static void OnValueChanged(BindableObject bindable, object oldValue, object newValue)
{
    var currentValue = newValue;
   
   // do something you want 
   
    // you could get other property like following 
    // var view = bindable as CorrectWrongRingChart;
    // var currentText = view.Text;


}

属性 Value会在我们改变它的source的值时自动改变。所以我们不需要再调用下面的行,这可能会导致无限循环。

if (value != null)
{

    ChartProperty.SetValue("CorrectWrongChart", CreateChart(value));
                
}