Ваша первоначальная мысль была правильной: вы можете привязать к привязкам, например, если вы хотите изменить обе оси вместе, у вас может быть ComboBox, подобный этому:
<ComboBox SelectedItem="{Binding AxisChoice}">
<my:AxisChoice XBinding="{Binding ID}" YBinding="{Binding Length}" />
<my:AxisChoice XBinding="{Binding Length}" YBinding="{Binding ID}" />
<my:AxisChoice XBinding="{Binding ID}" YBinding="{Binding Quality}" />
</ComboBox>
Чтобы сделать эту работу, вы должны объявитьСвойства XBinding и YBinding как CLR типа «Binding»:
public class AxisChoice
{
public Binding XBinding { get; set; }
public Binding YBinding { get; set; }
}
В идеале вы можете просто связать DependentValueBinding или IndependentValueBinding вашей диаграммы:
<Chart ...>
<LineSeries
DependentValueBinding="{Binding AxisChoice.XBinding}"
IndependentValueBinding="{Binding AxisChoice.YBinding}" />
</Chart>
К сожалению, это не работает, потому чтоDependentValueBinding и IndependentValueBinding не являются DependencyProperties.
Временное решение заключается в создании присоединенного DependencyProperty для отражения каждого свойства, которое не является DependencyProperty, например:
public class MakeDP : DependencyObject
{
public static Binding GetIndependentValueBinding(DependencyObject obj) { return (Binding)obj.GetValue(IndependentValueBindingProperty); }
public static void SetIndependentValueBinding(DependencyObject obj, Binding value) { obj.SetValue(IndependentValueBindingProperty, value); }
public static readonly DependencyProperty IndependentValueBindingProperty = DependencyProperty.RegisterAttached("IndependentValueBinding", typeof(Binding), typeof(MakeDP), new PropertyMetadata
{
PropertyChangedCallback = (obj, e) =>
{
((DataPointSeries)obj).IndependentValueBinding = (Binding)e.NewValue;
}
});
public static Binding GetDependentValueBinding(DependencyObject obj) { return (Binding)obj.GetValue(DependentValueBindingProperty); }
public static void SetDependentValueBinding(DependencyObject obj, Binding value) { obj.SetValue(DependentValueBindingProperty, value); }
public static readonly DependencyProperty DependentValueBindingProperty = DependencyProperty.RegisterAttached("DependentValueBinding", typeof(Binding), typeof(MakeDP), new PropertyMetadata
{
PropertyChangedCallback = (obj, e) =>
{
((DataPointSeries)obj).DependentValueBinding = (Binding)e.NewValue;
}
});
}
Таким образом, ваш XAML становится:
<Chart ...>
<LineSeries
my:MakeDP.DependentValueBinding="{Binding AxisChoice.XBinding}"
my:MakeDP.IndependentValueBinding="{Binding AxisChoice,YBinding}" />
</Chart>
Если вместо этого вы хотите изменить оси отдельно (два отдельных ComboBox или ListBoxes), вам не нужен AxisChoice: просто сделайте Items или ItemsSource каждого ComboBox состоящими из привязок и поместите XBinding «a»Свойства "и" YBinding "прямо в режиме просмотраl.
Обратите внимание, что если ваш элемент управления предоставляет обычное свойство вместо свойства типа Binding, вы все равно можете использовать этот метод, но в этом случае вы будете использовать BindingOperations.SetBinding вместо простого хранения значения привязки.
Например, если вы хотите изменить привязку текста в TextBlock с:
<TextBlock Text="{Binding FirstName}" />
на
<TextBlock Text="{Binding LastName}" />
на основе выбора ComboBox или ListBox,Вы можете использовать прикрепленное свойство следующим образом:
<TextBlock my:BindingHelper.TextBinding="{Binding XBinding}" />
Реализация присоединенного свойства тривиальна:
public class BindingHelper : DependencyObject
{
public static BindingBase GetTextBinding(DependencyObject obj) { return (BindingBase)obj.GetValue(TextBindingProperty); }
public static void SetTextBinding(DependencyObject obj, BindingBase value) { obj.SetValue(TextBindingProperty, value); }
public static readonly DependencyProperty TextBindingProperty = DependencyProperty.RegisterAttached("TextBinding", typeof(BindingBase), typeof(BindingHelper), new PropertyMetadata
{
PropertyChangedCallback = (obj, e) =>
BindingOperations.SetBinding(obj, TextBlock.TextProperty, (BindingBase)e.NewValue)
});
}