Привязать индекс DataContext к значению элемента управления Slider - PullRequest
1 голос
/ 23 октября 2019

Можно ли использовать текущее значение элемента управления ползунка WPF (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>

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Можно ли использовать текущее значение элемента управления WPF Slider (Slider.Value) в качестве входа для привязки индексации на другом элементе управления?

Нет, не напрямую. ?????? в {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>
0 голосов
/ 23 октября 2019

Объявите два свойства зависимости для вашего контекста данных: SliderIndex и SelectedItem (вы можете называть их как угодно, но это имена, которые я буду использовать для своего ответа).

Bind *От 1005 * до SliderIndex. Затем используйте PropertyChangedCallback, чтобы обновить свойство SelectedItem на основе нового значения SliderIndex. Наконец, свяжите StackPanel.DataContext с SelectedItem.

Это лучший из известных мне способов сделать это. Нет простого способа связать их напрямую, поскольку вы не можете использовать переменную в качестве индекса для привязки коллекции. Другой вариант - использовать IValueConverter или IMultiValueConverter, но, на мой взгляд, вышесказанное чище.

...