2011-09-12 62 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>