我在名为Indexer的类中有一个X属性,假设X[Y]给了我另一个类型为Z的对象:

<ContentControl Content="{Binding X[Y]}" ...???

如何在索引器中生成DataBinding?如果我执行{Binding [0]},它会起作用。但是{Binding X[Y]}只是将indexer参数作为一个字符串,即Y

更新:Converter是一个选项,但是我有很多带索引器的ViewModel类,并且没有类似的集合,因此我无法负担所有这些的单独转换器。所以我只是想知道WPF是否支持此功能,如何声明Content=X[Y],其中XYDataContext属性?

最佳答案

我发现完成此操作的唯一方法是通过MultiBindingIMultiValueConverter

<TextBlock DataContext="{Binding Source={x:Static vm:MainViewModel.Employees}">
    <TextBlock.Text>
       <MultiBinding Converter="{StaticResource conv:SelectEmployee}">
           <Binding />
           <Binding Path="SelectedEmployee" />
       </MultiBinding>
    </TextBlock.Text>
</TextBlock>

和您的转换器:
public class SelectEmployeeConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType,
        object parameter, CultureInfo culture)
    {
        Debug.Assert(values.Length >= 2);

        // change this type assumption
        var array = values[0] as Array;
        var list = values[0] as IList;
        var enumerable = values[0] as IEnumerable;
        var index = Convert.ToInt32(values[1]);

        // and check bounds
        if (array != null && index >= 0 && index < array.GetLength(0))
            return array.GetValue(index);
        else if (list != null && index >= 0 && index < list.Count)
            return list[index];
        else if (enumerable != null && index >= 0)
        {
            int ii = 0;
            foreach (var item in enumerable)
            {
                if (ii++ == index) return item;
            }
        }

        return Binding.DoNothing;
    }

    public object[] ConvertBack(object value, Type[] targetTypes,
        object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

关于c# - XAML索引器数据绑定(bind),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1792478/

10-09 22:49