2012-05-04 7 views
2

どのようにWPF ToolKit chartcontrolのデータソースを動的に更新できますか?次の例では、{Binding SomeText}を使用してTextBlock.Textプロパティを正しく更新し、MainWindowのDataContextをプロパティInputに設定します。 (下のコードを参照してください)WPF Toolkitチャートのitemsourceをパブリックプロパティに動的にデータバインドする方法はありますか?

TextBlock.TextはInput.SomeTextにバインドされ、ChartはInput.ValueListをデータソースとして使用すると想定しています。

グラフは空のままですが、私は、メインウィンドウのコンストラクタに

lineChart.DataContext = Input.ValueList; 

を配置することで一度それを埋めると「{}バインディング」=のItemsSourceにXAMLでバインディングを設定することができます。しかし、これは起動時にのみ機能し、たとえばボタンをクリックすると更新されません。アプリケーションが新しい受信データで実行されている間、グラフを更新したいと思います。

私は、次のXAML持っている:コード付き

<chartingToolkit:Chart Name="lineChart"> 

       <chartingToolkit:LineSeries DependentValuePath="Value" IndependentValuePath="Key" ItemsSource="{Binding ValueList}"> 
       </chartingToolkit:LineSeries> 

</chartingToolkit:Chart> 
<Button Width="100" Height="24" Content="More" Name="Button1" /> 
<TextBlock Name="TextBlock1" Text="{Binding SomeText}" /> 

class MainWindow 
{ 

    public DeviceInput Input; 

    public MainWindow() 
    { 
     InitializeComponent(); 

     Input = new DeviceInput(); 
     DataContext = Input; 
      lineChart.DataContext = Input; 
     Input.SomeText = "Lorem ipsum."; 

    } 

    private void Button1_Click(System.Object sender, System.Windows.RoutedEventArgs e) 
    { 
     Input.AddValues(); 
    } 
} 

public class DeviceInput : INotifyPropertyChanged 
{ 

    private string _SomeText; 
    public string SomeText { 
     get { return _SomeText; } 

     set { 
      _SomeText = value; 
      OnPropertyChanged("SomeText"); 
     } 
    } 


    public List<KeyValuePair<string, int>> ValueList {get; private set;} 

    public DeviceInput() 
    { 
     ValueList = (new List<KeyValuePair<string, int>>()); 
     AddValues(); 
    } 

    public void AddValues() 
    { 
      //add values (code removed for readability) 
     SomeText = "Items: " + ValueList.Count.ToString(); 
     OnPropertyChanged("ValueList"); 
    } 

    public event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged; 

    private void OnPropertyChanged(String info) 
    { 
     if (PropertyChanged != null) { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 

} 

SomeTextが更新され、私はTextBlock内ValueList.Countを配置し、あなたが見ることができることを確認してValueListの変更を行うことをしかし、チャートは同じままです。

だから、これは1結合succesfullの(しかし、doesntの更新)になり:

lineChart.DataContext = Input.ValueList; 

ItemsSource="{Binding}" 

これは全く結合しない:

ItemsSource="{Binding ValueList}" 

答えて

6

バインドWPFのパブリックプロパティを使用すると、

必要があるので、
public List<KeyValuePair<string, int>> ValueList {get; private set;} 

EDIT:hereチャートコントロールを使用する方法について詳しくは、

EDIT2:

ItemsSource="{Binding ValueList}" 

あなたが最初のプロパティとしてのValueListを作成する必要が第二あなたは(あなたがあなたのmainwindow.csに行ったように)DeviceInputのインスタンスへのDataContextを設定する必要があるため、これは動作しないことができます。

EDIT3:迅速かつ汚い例は、単に&ペーストをコピーして、ボタンを押した場合、データは

のviewmodel

public class Input 
{ 
    public ObservableCollection<KeyValuePair<string, int>> ValueList { get; private set; } 

    public Input() 
    { 
     this.ValueList = new ObservableCollection<KeyValuePair<string, int>>(); 
     ValueList.Add(new KeyValuePair<string, int>("Developer", 60)); 
     ValueList.Add(new KeyValuePair<string, int>("Misc", 20)); 
     ValueList.Add(new KeyValuePair<string, int>("Tester", 50)); 
     ValueList.Add(new KeyValuePair<string, int>("QA", 30)); 
     ValueList.Add(new KeyValuePair<string, int>("Project Manager", 40)); 
    } 

    public void Add(KeyValuePair<string, int> data) 
    { 
     ValueList.Add(data); 
    } 
} 

window.cs

public partial class MainWindow : Window 
{ 
    private Input data; 
    public MainWindow() 
    { 
    data= new Input(); 
    InitializeComponent(); 
    this.DataContext = data; 
    } 

    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
    this.data.Add(new KeyValuePair<string, int>("XXX", 27)); 
    } 

} 

XAML

を追加されます
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" Margin="0,-28,0,28"> 
    <Grid Height="921"> 
     <chartingToolkit:Chart Height="262" HorizontalAlignment="Left" Margin="33,0,0,620" Name="columnChart" Title="Column Series Demo" VerticalAlignment="Bottom" Width="360"> 
      <chartingToolkit:ColumnSeries DependentValuePath="Value" IndependentValuePath="Key" ItemsSource="{Binding ValueList }" />    
     </chartingToolkit:Chart> 
     <chartingToolkit:Chart Name="pieChart" Title="Pie Series Demo" VerticalAlignment="Top" Margin="449,39,43,0" Height="262"> 
      <chartingToolkit:PieSeries DependentValuePath="Value" IndependentValuePath="Key" ItemsSource="{Binding ValueList }" IsSelectionEnabled="True" /> 
     </chartingToolkit:Chart> 
     <chartingToolkit:Chart Name="areaChart" Title="Area Series Demo" VerticalAlignment="Top" Margin="33,330,440,0" Height="262"> 
      <chartingToolkit:AreaSeries DependentValuePath="Value" IndependentValuePath="Key" ItemsSource="{Binding ValueList }" IsSelectionEnabled="True"/> 
     </chartingToolkit:Chart> 
     <chartingToolkit:Chart Name="barChart" Title="Bar Series Demo" VerticalAlignment="Top" Margin="449,330,43,0" Height="262"> 
      <chartingToolkit:BarSeries DependentValuePath="Value" IndependentValuePath="Key" ItemsSource="{Binding ValueList }" IsSelectionEnabled="True"/> 
     </chartingToolkit:Chart> 
     <chartingToolkit:Chart Name="lineChart" Title="Line Series Demo" VerticalAlignment="Top" Margin="33,611,440,0" Height="254"> 
      <chartingToolkit:LineSeries DependentValuePath="Value" IndependentValuePath="Key" ItemsSource="{Binding ValueList }" IsSelectionEnabled="True"/> 
     </chartingToolkit:Chart> 
     <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="342,10,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" /> 
    </Grid> 
</ScrollViewer> 
+0

ValueListをプロパティにすることは役に立たないようです。私は既にあなたが共有したリンクを読みました。そこに記載されている方法で、私はデータを1回バインドすることができます。上で述べたように、テキストボックスはうまく更新されます。何が間違っているxamlの何かになることができますか? – Ben

+0

私は今、valuelistをポパッティーにして、このようなインスタンスにdatacontextを設定しました: DataContext = Input; lineChart.DataContext =入力。 なぜ1度だけバインドするのですか? // EDIT:ItemsSource = "{Binding ValueList}"は一度だけバインドされますが、値を追加すると更新されません。 – Ben

+0

私の編集2を参照してください。でも、observablecollectionを使用していないため、addvaluesメソッドにも問題があると思います。 – blindmeis

関連する問題