2011-09-12 99 views
0

我遇到了DataContext和Title的問題。下面按預期工作:從ItemsSource上下文綁定

<chartingToolkit:LineSeries Title={Binding TrendDaily.Name} ItemsSource="{Binding TrendDaily.Progress}"> 
//... 
</chartingToolkit:LineSeries> 

但標題應包含更多的信息,所以我這樣做:

<chartingToolkit:LineSeries ItemsSource="{Binding TrendDaily.Progress}"> 
    <chartingToolkit:LineSeries.Title> 
    <StackPanel Orientation="Horizontal"> 
     <TextBlock Text="{Binding TrendDaily.Name}"/> 
     <TextBlock Text="-test text"/> 
    </StackPanel> 
    </chartingToolkit:LineSeries.Title> 
    //... 
</chartingToolkit:LineSeries> 

我想通了標題綁定不工作,因爲它具有「進步「元素作爲他的背景,但我無法找到有效的約束。

編輯: 完整的新代碼綁定錯誤(參考 '的ElementName = LineName' 結合找不到源):

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns:chartingToolkit="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<chartingToolkit:Chart Title="Trend"> 
    <chartingToolkit:Chart.Series>    
     <chartingToolkit:LineSeries DataContext="{Binding TrendDaily}" 
ItemsSource="{Binding Progress}" DependentValuePath="Value" IndependentValuePath="Key" x:Name="LineName"> 
      <chartingToolkit:LineSeries.Title> 
       <TextBlock> 
          <Run Text="{Binding DataContext.Name, ElementName=LineName}"/> 
          <Run Text="*"/>         
       </TextBlock> 
      </chartingToolkit:LineSeries.Title>     
     </chartingToolkit:LineSeries> 
    </chartingToolkit:Chart.Series> 
</chartingToolkit:Chart> 
</Window> 

代碼背後:

public partial class MainWindow : Window 
{ 
    public TrendDailyClass TrendDaily { get; set; } 

    public MainWindow() 
    { 
     TrendDaily = new TrendDailyClass(); 
     DataContext = this; 
     InitializeComponent(); 
    } 
} 

public class TrendDailyClass 
{ 
    public Dictionary<string, double> Progress { get; set; } 
    public string Name { get; set; } 
    public TrendDailyClass() 
    { 
     Progress = new Dictionary<string, double>(); 
     Progress.Add("10", 10); 
     Progress.Add("20", 20); 
     Name = "test"; 
    } 
} 

回答

1

綁定TrendDailyDataContextLineSeries,然後在內部綁定中使用DataContext,使用ElementName作爲:

<chartingToolkit:Chart Title="Trend" 
        DataContext="{Binding TrendDaily}" 
        x:Name="LineName"> 
    <chartingToolkit:LineSeries ItemsSource="{Binding Progress}"> 
    <chartingToolkit:LineSeries.Title> 
     <StackPanel Orientation="Horizontal"> 
     <TextBlock Text="{Binding DataContext.Name, ElementName=LineName}"/> 
     <TextBlock Text="-test text"/> 
     </StackPanel> 
    </chartingToolkit:LineSeries.Title> 
    //... 
    </chartingToolkit:LineSeries> 

此外,也沒有必要使用兩個TextBlock。您可以使用Run(這是非常輕便類)爲:

<StackPanel Orientation="Horizontal"> 
     <TextBlock> 
      <Run Text="{Binding DataContext.Name, ElementName=LineName}"/> 
      <Run Text="-test text"/> 
     </TextBlock> 
    </StackPanel> 

這是更好,因爲它避免了不必要的視覺元素。來自UIElement的類相對較重。

+0

看來,這並不爲我工作。我收到以下錯誤: BindingExpression路徑錯誤:'Name'屬性在'object'''LineDataPoint'(Name ='')'找不到。 BindingExpression:路徑=名稱; DataItem ='LineDataPoint'(Name ='');目標元素是'TextBlock'(Name ='');目標屬性是'文本'(類型'String') – michael

+0

@michael:對不起,我忘記使用'ElementName'。無論如何,我編輯了我的答案。請注意,我在'LineSeries'上使用了'x:Name'。 – Nawaz

+0

現在我得到: 找不到與參考'ElementName = LineName'綁定的源代碼。 BindingExpression:路徑=名稱;的DataItem = NULL;目標元素是'運行'(HashCode = 54686603);目標屬性是'文本'(類型'字符串') - 從我的理解這應該工作,因爲我已經添加了x:名稱和元素名稱。 – michael

0

如果你是第一個代碼示例工作,你應該能夠使用StringFormat財產在你第一次綁定:

<chartingToolkit:LineSeries Title={Binding TrendDaily.Name, StringFormat='{}{0}-test text'} ItemsSource="{Binding TrendDaily.Progress}"> 
//... 
</chartingToolkit:LineSeries>