【问题标题】:What is wrong with this binding syntax: {Binding List[Index]}?这个绑定语法有什么问题:{Binding List[Index]}?
【发布时间】:2012-12-04 12:55:43
【问题描述】:

给定一个数据对象:{List = new Int32[] {0, 1, 2, 3}, Index = 2},我想使用以下语法将其绑定到控件:

{Binding List[Index]}

这不起作用并且不会引发任何异常。我也无法通过将转换器附加到此绑定来查看发生了什么。

只要我能做到{Binding List[0]} 为什么这个不起作用:{Binding List[Index]}

【问题讨论】:

    标签: silverlight xaml data-binding


    【解决方案1】:

    为此,您必须使用 MultiBinding 和转换器,因为索引本身需要绑定。

    例如

    <MyControl>
      <MyControl.Text>
        <MultiBinding Converter="{StaticResource yourConverter}">
          <MultiBinding.Bindings>
            <Binding Path="List" />
            <Binding Path="Index" />
          </MultiBinding.Bindings>
        </MultiBinding>
      </MyControl.Text>
    </MyControl>
    

    还有转换器:

    public class NameConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            if (values.Length != 2 || !(values[0] is IList<MyItemType>) || !(values[1] is int))
                return Binding.DoNothing;
    
            var list = (IList<MyItemType>)values[0];
            var index = (int)values[1];
    
            if (index < 0 || index >= list.Count)
                return Binding.DoNothing;
    
            return list[index];
        }
    
        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            return Binding.DoNothing;
        }
    }
    

    Silverlight 的多绑定解决方案(由 Google 提供):

    SL3:http://www.olsonsoft.com/blogs/stefanolson/post/Improvements-to-Silverlight-Multi-binding-support.aspx

    SL4:http://www.scottlogic.co.uk/blog/colin/2010/05/silverlight-multibinding-solution-for-silverlight-4/

    SL5:http://www.codeproject.com/Articles/286171/MultiBinding-in-Silverlight-5

    【讨论】:

    • 不幸的是,默认情况下 Silverlight 中没有 IMultiValueConverter 这样的东西。你介意给出一个基于 IValueConverter 的实现
    • 很好的解决方案。我没有想到 MultiBinding,因为 Silverlight 本身不支持它...
    【解决方案2】:

    在解析 XAML 时计算绑定表达式。因此,那里使用的值必须是编译时常量,以便它们可以内置到稍后用于绑定的表达式中。

    因此,一种方法是在您的 ViewModel 上创建一个属性,该属性公开您要绑定到的 List 的项目。

    不幸的是,这里也没有选择使用ValueConverter,因为您无法绑定到绑定表达式的ConverterParameter,因此转换器也不知道索引...

    【讨论】:

      猜你喜欢
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      • 2014-04-13
      • 1970-01-01
      • 1970-01-01
      • 2016-09-06
      • 2012-07-07
      • 2012-05-02
      相关资源
      最近更新 更多