【问题标题】:Bind DataContext Index to Slider Control Value将 DataContext 索引绑定到滑块控件值
【发布时间】:2019-10-22 22:12:29
【问题描述】:

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


    【解决方案1】:

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

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

    您可以同时绑定到SliderDataContextValue 属性,并使用转换器来执行查找:

    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>
    

    【讨论】:

    • 这真的很好,而且很有意义。感谢您的回复。
    【解决方案2】:

    在您的数据上下文中声明两个依赖属性:SliderIndexSelectedItem(您可以随意命名它们,但我将在回答中使用这些名称)。

    Slider.Value 绑定到SliderIndex。然后使用PropertyChangedCallback 根据SliderIndex 的新值更新SelectedItem 属性。最后将StackPanel.DataContext绑定到SelectedItem

    这是我所知道的最好的方法。没有简单的方法可以直接绑定这两者,因为您不能将变量用作集合绑定的索引。另一种选择是使用IValueConverterIMultiValueConverter,但我认为上面的更简洁。

    【讨论】:

    • 感谢您的评论。我的目的是在 XAML 中实现这一切,这样数据隐藏层就不必反映或提供数据表示层的机制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    相关资源
    最近更新 更多