2012-05-04 36 views
2

如何動態更新WPF ToolKit chartcontrol的數據源?在下面的示例中,我使用{Binding SomeText}成功更新TextBlock.Text屬性,並將MainWindow的DataContext設置爲屬性Input。 (請參閱下面的代碼)如何將WPF Toolkit圖表的項目源動態綁定到公共屬性?

TextBlock.Text綁定到Input.SomeText,Chart假定使用Input.ValueList作爲數據源。

雖然圖表仍然爲空。我可以放置

lineChart.DataContext = Input.ValueList; 

在主窗口構造一旦填充它,並設置在XAML到的ItemsSource「{結合}」的結合=。但是這隻在啓動時才起作用,例如當你點擊一個按鈕時它不會更新。我想在應用程序運行時使用新的傳入數據更新圖表。

我有以下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得到更新,並確保值列表的變化,我把ValueList.Count在文本塊,你可以看到按照它應該上升的趨勢,但是圖表保持不變。

所以這導致1 succesfull綁定(但犯規更新):

lineChart.DataContext = Input.ValueList; 

ItemsSource="{Binding}" 

這並不是在所有綁定:

ItemsSource="{Binding ValueList}" 

回答

6

WPF綁定到公共屬性,所以你需要

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

編輯:here有關使用圖表控件的更多信息。

EDIT2:

ItemsSource="{Binding ValueList}" 

這可不行,因爲你必須首先創建值列表作爲一個屬性,第二你需要到DataContext設置爲DeviceInput的一個實例(如你在mainwindow.cs一樣) 。

EDIT3:快速和骯髒的例子,簡單的複製粘貼&,如果你按下按鈕的數據將被添加

視圖模型

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屬性似乎沒有幫助。我已經閱讀過您分享的鏈接,使用上面提到的方法,當ValueList更新圖表時,我可以綁定數據1次。如上所述,文本框會成功更新。它可能是xaml中的問題什麼是錯誤的? – Ben

+0

我已經將值賦給了一個屬性,並將datacontext設置爲這樣的實例: DataContext = Input; lineChart.DataContext =輸入; 爲什麼它只綁定一次? //編輯:所以ItemsSource =「{Binding ValueList}」只能成功綁定,但只添加1次,添加更多值時不會更新。 – Ben

+0

看到我的編輯2.不過,我認爲你的addvalues方法也有一個問題,因爲你不使用observablecollection – blindmeis