是否可以使用WPF Slider控件的当前值(Slider.value(作为另一个控件上索引绑定的输入?
用例:项目集合被设置为控件的DataContext,滑块用于选择显示集合中的哪个项目。
<Slider x:Name="selector" Minimum="1" Maximum="{Binding Count}"/>
<!-- How to grab the value of selector and use as indexer?? -->
<StackPanel DataContext="{Binding [??????]}">
<TextBlock Text="{Binding name}"/>
<TextBlock Text="{Binding job}" />
</StackPanel>
是否可以使用WPF Slider控件(
Slider.Value
(的当前值作为另一个控件上索引绑定的输入?
不,不直接。{Binding [??????]}
中的??????
必须是编译时间常数。
您可以绑定到Slider
的DataContext
和Value
属性,并使用转换器执行查找
public class MultiConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
var yourDataContext = values[0] as IDictionary<double, object>; //cast to whatever the type of your DataContext is
double value = (double)values[1];
return yourDataContext[value];
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) =>
throw new NotSupportedException();
}
XAML:
<StackPanel>
<StackPanel.DataContext>
<MultiBinding>
<MultiBinding.Converter>
<local:MultiConverter />
</MultiBinding.Converter>
<Binding Path="." />
<Binding Path="Value" ElementName="selector" />
</MultiBinding>
</StackPanel.DataContext>
<TextBlock Text="{Binding name}"/>
<TextBlock Text="{Binding job}" />
</StackPanel>
在数据上下文中声明两个依赖属性:SliderIndex
和SelectedItem
(您可以随心所欲地命名它们,但这些名称我将用于回答(。
将Slider.Value
绑定到SliderIndex
。然后使用PropertyChangedCallback
基于SliderIndex
的新值来更新SelectedItem
属性。最后,将StackPanel.DataContext
与SelectedItem
结合。
这是我所知道的最好的方法。由于不能将变量用作集合绑定的索引,因此没有简单的方法直接绑定两者。另一种选择是使用IValueConverter
或IMultiValueConverter
,但在我看来,以上更干净。