UWP c # Динамически менять график при изменении данных - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь создать диаграмму (UWP-c #), которая динамически изменяется при изменении исходных данных.

Например:

xaml file:

<StackPanel>
        <Button Name="scatterButton" Content="click" Click="ScatterButton_Click" />
        <Charting:Chart x:Name="test_chart">
            <Charting:ScatterSeries IndependentValuePath="Name" DependentValuePath="Amount"  />
        </Charting:Chart>
    </StackPanel>

c #:

    public class SmartPhone
{
    public string Name { get; set; }
    public int Amount { get; set; }
    public int Other { get; set; }
}

public sealed partial class MainPage : Page 
{

    List<SmartPhone> lstSource = new List<SmartPhone>
    {
        new SmartPhone() { Name = "IPhone", Amount = 40, Other = 1 },
        new SmartPhone() { Name = "Android", Amount = 30, Other = 1 },
        new SmartPhone() { Name = "UWP", Amount = 25, Other = 2 }
    };

    public MainPage()
    {
        this.InitializeComponent();
    }

    private void Page_Loaded(object sender, RoutedEventArgs e)
    {
        LoadChartContent();
    }

    private void LoadChartContent()
    {
        (test_chart.Series[0] as ScatterSeries).ItemsSource = lstSource;
    }

    private void ScatterButton_Click(object sender, RoutedEventArgs e)
    {
        lstSource[0].Amount = 10;
    }
}

Идея состоит в том, когда я нажимаю кнопку «Сумма» и меняю значение на графике.

Я пробовал много пакетов, но этоединственный, который действительно работал для меня в UWP.NuGet это "WinRTXamlToolkit.Controls.DataVisualization".Пожалуйста, попробуйте сосредоточиться на "ScatterSeries", так как это то, что мне нужно.

Спасибо.

1 Ответ

0 голосов
/ 11 февраля 2019

Сначала вы должны использовать ObservableCollection вместо List, чтобы автоматически уведомлять, когда элементы добавляются или удаляются.Чтобы уведомить об изменениях, вам нужно реализовать INotifyPropertyChanged и вызвать событие PropertyChanged.

xaml:

        <Charting:Chart x:Name="test_chart">
            <Charting:ScatterSeries ItemsSource="{x:Bind LstSource}" IndependentValuePath="Name" DependentValuePath="Amount"  />
        </Charting:Chart>

Пример класса смартфона:

public class SmartPhone : INotifyPropertyChanged
    {
        private int _amount;

        public string Name { get; set; }

        public int Amount
        {
            get { return _amount; }
            set
            {
                this._amount = value;
                NotifyPropertyChanged();
            }
        }

        public int Other { get; set; }

        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }

Класс MainPage:

    public sealed partial class MainPage : Page
    {

        public ObservableCollection<SmartPhone> LstSource
        {
            get { return lstSource; }
        }

        private ObservableCollection<SmartPhone> lstSource = new ObservableCollection<SmartPhone>
        {
            new SmartPhone() {Name = "IPhone", Amount = 10, Other = 1},
            new SmartPhone() {Name = "Android", Amount = 30, Other = 1},
            new SmartPhone() {Name = "UWP", Amount = 25, Other = 2}
        };


        public MainPage()
        {
            this.InitializeComponent();
            //LoadChartContent();
        }

        private void ScatterButton_Click(object sender, RoutedEventArgs e)
        {
            lstSource[0].Amount = 30;
            //lstSource.Add(new SmartPhone{Amount = 10, Name = "asd", Other = 2});

        }
    }

Надеюсь, это все, что тебе нужно.

...