Как сделать связывание (DataSet to Chart) программно? - PullRequest
1 голос
/ 01 января 2011

Может ли кто-нибудь определить проблему в этом коде?(Я новичок в привязках WPF.) Этот код выполняется после загрузки диаграммы, когда я нажимаю кнопку: я получаю эту ошибку:

Обновление: Я не понимаюошибка больше.Спасибо Томасу.

Теперь ошибки не возникает, но диаграмма выглядит совершенно пустой (без столбцов)

Обновление: Код теперь выглядит следующим образом:

            // create a very simple DataSet
        var dataSet = new DataSet("MyDataSet");
        var table = dataSet.Tables.Add("MyTable");
        table.Columns.Add("Name");
        table.Columns.Add("Price");
        table.Rows.Add("Brick", 1.5d);
        table.Rows.Add("Soap", 4.99d);
        table.Rows.Add("Comic Book", 0.99d);

        // chart series
        var series = new ColumnSeries()
        {
            IndependentValueBinding = new Binding("[Name]"), // How to deal with
            DependentValueBinding = new Binding("[Price]"), //  these two?
            ItemsSource = dataSet.Tables[0].DefaultView // or maybe I do mistake here?
        };

        // ---------- set additional binding as adviced ------------------
        series.SetBinding(ColumnSeries.ItemsSourceProperty, new Binding());

        // chart stuff
        MyChart.Series.Add(series);
        MyChart.Title = "Names 'n Prices";

        // some code to remove legend
        var style = new Style(typeof(Control));
        style.Setters.Add(new Setter(LegendItem.TemplateProperty, null));
        MyChart.LegendStyle = style;

XAML:

<Window x:Class="BindingzTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="606" Width="988" xmlns:charting="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit">
<Grid Name="LayoutRoot">
    <charting:Chart Name="MyChart" Margin="0,0,573,0" Height="289" VerticalAlignment="Top" />
    <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="272,361,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="chart1_Loaded" />
</Grid>
</Window>

Ответы [ 3 ]

1 голос
/ 01 января 2011

Я вроде как решил ...

        // create a very simple DataSet
        var dataSet = new DataSet("MyDataSet");
        var table = dataSet.Tables.Add("MyTable");
        table.Columns.Add("Name");
        table.Columns.Add("Price");
        table.Rows.Add("Brick", 1.5d);
        table.Rows.Add("Soap", 4.99d);
        table.Rows.Add("Comic Book", 0.99d);
        table.Rows.Add("Broken Table", 10.99d);

        // chart series
        var series = new ColumnSeries()
        {             
            IndependentValueBinding = new Binding("Key"),
            DependentValueBinding = new Binding("Value"), 
            ItemsSource = from x in dataSet.Tables[0].AsEnumerable()
                          select new KeyValuePair<string, double>((string)x["Name"], double.Parse((string)x["Price"]))
        };

        // chart stuff       
        MyChart.Series.Add(series); 
        MyChart.Title = "Names 'n Prices"; 

        // some code to remove legend    
        var style = new Style(typeof(Control)); 
        style.Setters.Add(new Setter(LegendItem.TemplateProperty, null));   
        MyChart.LegendStyle = style; 

Из-за того, что в SetBinding () диаграмма только выглядела пустой ...

LINQ владеет, но добавляет ненужную сложность. Должен быть способ сделать это без linq ... Хотя я доволен результатами. На данный момент.

Спасибо всем.

1 голос
/ 02 января 2011

Найден еще лучший способ использования преобразователей значений: П.С .: Я получал исключения, потому что объекты, хранящиеся в таблице, были преобразованы в строки по умолчанию. Диаграмма нуждалась число ... Поэтому я написал ValueConverter и все заработало.

    // create a very simple DataSet
    var dataSet = new DataSet("MyDataSet");
    var table = dataSet.Tables.Add("MyTable");
    table.Columns.Add("Name");         
    table.Columns.Add("Price");
    table.Rows.Add("Brick", 1.5d);
    table.Rows.Add("Soap", 4.99d);   
    table.Rows.Add("Comic Book", 0.99d);   
    table.Rows.Add("Broken Table", 10.99d);  
    // chart series         
    var series = new ColumnSeries()     
    {                          
        IndependentValueBinding = new Binding("Key"), 
        DependentValueBinding = new Binding("Value")
        {
             Converter = new Conv()
        },
        ItemsSource = dataSet.Tables["MyTable"]; 

    };          
    // chart stuff
    MyChart.Series.Add(series);
    MyChart.Title = "Names 'n Prices";
    // some code to remove legend     
    var style = new Style(typeof(Control)); 
    style.Setters.Add(new Setter(LegendItem.TemplateProperty, null));                
    MyChart.LegendStyle = style;  

...

 public class Conv : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return System.Convert.ToInt32(value.ToString());
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value.ToString();
    }
}
1 голос
/ 01 января 2011

Кажется, что вы должны вызвать метод SetBinding, как указано здесь http://forums.silverlight.net/forums/p/151817/350809.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...