从ItemsSource上下文绑定

时间:2011-09-12 16:54:39

标签: c# wpf binding datacontext

我遇到了DataContext和Title的问题。以下按预期工作:

 <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>

我发现Title绑定不起作用,因为它有“Progress”元素作为他的上下文,但我无法找到有效的绑定。

编辑: 带有绑定错误的完整新代码(无法找到与引用'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";
    }
}

2 个答案:

答案 0 :(得分:1)

TrendDaily绑定到DataContext的{​​{1}},然后在内部绑定中使用LineSeries,使用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> 派生的类相对较重。

答案 1 :(得分:0)

如果您是第一个代码示例正在运行,您应该能够在第一个绑定中使用StringFormat属性:

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