Xamarin表格网格 - 通过按钮更改单元格视图

时间:2015-08-06 09:08:26

标签: xamarin xamarin.forms

我有一个页面,其中显示两个不同的图表,具体取决于按钮点击。目前我以这种方式更改图表:

    protected void ClickedChangeChart()
    {
        if (chartType == true) 
        {
            chartType = false;
            Navigation.PushAsync (new MainPage (false));
        } 

        else 
        {
            chartType = true;
            Navigation.PushAsync (new MainPage (true));
        }
    }

chartType是一个bool,根据它的值,我选择在OnAppearing()中使用此语句加载哪个图表:

protected override async void OnAppearing ()
{
// some code
    ChartView chartView = new ChartView 
    { 
    VerticalOptions = LayoutOptions.FillAndExpand, 
    HorizontalOptions = LayoutOptions.FillAndExpand,
    HeightRequest = 300,
    WidthRequest = 400
    }; 

    if (chartType == true)//true = candle
    { 
        candleModel = new CandleModel ();
        chartView.Model = await candleModel.GetModel ();
    } 

    else if(chartType == false) //false = line
    {
        lineModel = new LineModel ();
        chartView.Model = await lineModel.GetModel ();
    }

    //here I create a grid, add some children to it and the add the chartView
    grid.Children.Add (chartView, 1, 6, 1, 3);

    Content = grid;
}

问题是,当我想切换图表时,我必须重新加载整个页面,这不是我想要的。当我点击一个按钮时,我怎么能这样做呢?我调用了一个切换图表模型的功能?我想它会是这样的,但我不能让它起作用:

    public async void ClickedButton()
    {
        grid.Children.Remove(chartView);

        if (chartType == true)
        { 
            candleModel = new CandleModel ();
            chartView.Model = await candleModel.GetModel ();
        } 

        else if(chartType == false)
        {
            lineModel = new LineModel ();
            chartView.Model = await lineModel.GetModel ();
        }
        grid.Children.Add(chartView);
    }

更新 使用Daniel Luberda的解决方案,我设法使用它:

btnChartType.Clicked += async delegate {
    Device.BeginInvokeOnMainThread (async () => {
        grid.Children.Remove (chartView);

        if (isCandle == true) { 
            candleModel = new CandleModel ();
            chartView.Model = await candleModel.GetModel ();
            isCandle = false;
        } else if (isCandle == false) {
            lineModel = new LineModel ();
            chartView.Model = await lineModel.GetModel ();
            isCandle = true;
        }
                grid.Children.Add (chartView, 1, 6, 1, 3); 
    });
};

1 个答案:

答案 0 :(得分:0)

你不能让它工作,因为你有一个异步方法,这意味着你在另一个线程上做它。您只能从UI线程更改UI。另外async void会吞下所有例外,最好使用async Task

// THAT WILL WORK

public async void ClickedButton() // but public async Task would be better
{
    Device.BeginInvokeOnMainThread(async () => {
        grid.Children.Remove(chartView);

        if (chartType == true)
        { 
            candleModel = new CandleModel ();
            chartView.Model = await candleModel.GetModel ();
        } 

        else if(chartType == false)
        {
            lineModel = new LineModel ();
            chartView.Model = await lineModel.GetModel ();
        }
        grid.Children.Add(chartView);   
    });
}