首页 > 解决方案 > 将 DataContext 索引绑定到滑块控件值

问题描述

是否可以使用 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>

标签: wpfxamldata-binding

解决方案


是否可以使用 WPF Slider 控件 ( Slider.Value) 的当前值作为另一个控件上的索引绑定的输入?

不,不是直接的。??????in{Binding [??????]}必须是编译时常量。

您可以同时绑定到DataContext和 的Value属性,Slider并使用转换器来执行查找:

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>

推荐阅读