Привязка из контекста ItemsSource - PullRequest
0 голосов
/ 12 сентября 2011

У меня проблема с DataContext и названием.Следующее работает как задумано:

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

Я понял, что привязка заголовка не работает, потому что онаимеет элементы "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 ]

1 голос
/ 12 сентября 2011

Привязать TrendDaily к DataContext из 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>

Более того, нет необходимости использоватьtwo TextBlock .. Вы можете использовать Run (это очень легкий класс) как:

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

Это лучше, так как избегает ненужных визуальных элементов.Классы, полученные из UIElement, относительно тяжелее.

0 голосов
/ 13 сентября 2011

Если вы работаете с первым примером кода, вы можете использовать свойство StringFormat в первой привязке:

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