var stream = await chart.GetStreamAsync(); //This won't work for me as I have no chart reference.
I have looked at all the events and there is nothing I can hook into and get a chart reference. As a test I
converted the LostFocus event to a command. This worked in that I was to get a chart reference. Obviously
this cannot work in in practice as the user has to cause the lost focus event which I cannot rely on.
Is there some way I can get this working?
Thanks
Mark.
|
<chart:SfChart x:Name="chart" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
….
</chart:SfChart>
<Button Text="getStream" Clicked="Button_Clicked"/> |
|
public class ViewModel
{
public Func<object> GetStream;
…
} |
|
public partial class MainPage : ContentPage
{
ViewModel viewModel;
public MainPage ()
{
InitializeComponent ();
viewModel = new ViewModel();
this.BindingContext = viewModel;
viewModel.GetStream = () => chart.GetStreamAsync();
}
private void Button_Clicked(object sender, EventArgs e)
{
//get the chart stream
var stream = viewModel.GetStream.Invoke();
}
} |
|
<chart:SfChart x:Name="chart" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
<chart:SfChart.Behaviors>
<local:EventToCommandBehavior EventName="SeriesRendered" Command="{Binding
ChartSeriesRenderedCommand}" CommandParameter="{x:Reference chart}"/>
</chart:SfChart.Behaviors>
</chart:SfChart> |
|
public ICommand ChartSeriesRenderedCommand { get; private set; }
public ViewModel()
{
….
ChartSeriesRenderedCommand = new Command<SfChart>(ChartRenderedEvent);
}
private void ChartRenderedEvent(object args)
{
//here you can get the chart reference
var chart = args as SfChart;
var stream = chart.GetStreamAsync();
}
… |
|
public partial class MainPage : ContentPage
{
ViewModel viewModel;
public MainPage ()
{
InitializeComponent ();
viewModel = new ViewModel();
this.BindingContext = viewModel;
}
private async void Button_Clicked(object sender, EventArgs e)
{
//get the chart stream
if(viewModel.GetStream != null)
{
var stream = await viewModel.GetStream.Invoke();
}
}
}
public class ViewModel : INotifyPropertyChanged
{
….
public Func<Task<Stream>> GetStream;
public ViewModel()
{
….
ChartSeriesRenderedCommand = new Command<SfChart>(ChartRenderedEvent);
}
private void ChartRenderedEvent(object args)
{
//here you can get the chart reference
var chart = args as SfChart;
GetStream = async () => await chart.GetStreamAsync();
}
….
} |
|
…
public ChartViewModel()
{
Vehicles.CollectionChanged += Vehicles_CollectionChanged;
}
bool isChartRendered;
public Func<Task<Stream>> GetStream;
private async void Vehicles_CollectionChanged(object sender,
System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
{
if (isChartRendered)
{
if (GetStream != null)
{
var stream = await GetStream.Invoke();
}
}
}
}
…
public ICommand ChartRenderedCommand
{
get
{
return new Command(async (eventArgs) =>
{
if (eventArgs != null)
{
SfChart chart = eventArgs as SfChart;
if (chart != null)
{
GetStream = async () => await chart.GetStreamAsync();
Stream chartStream = await GetStream.Invoke();
isChartRendered = true;
}
}
});
}
} |