代码之家  ›  专栏  ›  技术社区  ›  nosale

绑定到显式接口索引器实现

  •  1
  • nosale  · 技术社区  · 6 年前

    如何绑定到显式接口索引器实现?

    假设我们有两个接口

    public interface ITestCaseInterface1
    {
        string this[string index] { get; }
    }
    
    public interface ITestCaseInterface2
    {
        string this[string index] { get; }
    }
    

    实现这两者的类

    public class TestCaseClass : ITestCaseInterface1, ITestCaseInterface2
    {
        string ITestCaseInterface1.this[string index] => $"{index}-Interface1";
    
        string ITestCaseInterface2.this[string index] => $"{index}-Interface2";
    }
    

    和一个数据模板

    <DataTemplate DataType="{x:Type local:TestCaseClass}">
                    <TextBlock Text="**BINDING**"></TextBlock>
    </DataTemplate>
    

    到目前为止我所做的努力没有任何成功

    <TextBlock Text="{Binding (local:ITestCaseInterface1[abc])}" />
    <TextBlock Text="{Binding (local:ITestCaseInterface1)[abc]}" />
    <TextBlock Text="{Binding (local:ITestCaseInterface1.Item[abc])}" />
    <TextBlock Text="{Binding (local:ITestCaseInterface1.Item)[abc]}" />
    

    我该怎么办 Binding 看起来像?

    谢谢

    1 回复  |  直到 6 年前
        1
  •  2
  •   Rekshino    6 年前

    不能在XAML中访问索引器,这是接口的显式实现。

    您可以为每个接口编写一个值转换器,在绑定和设置中使用适当的转换器。 ConverterParameter 至所需键:

    public class Interface1Indexer : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return (value as ITestCaseInterface1)[parameter as string];
        }
    
        public object ConvertBack(object value, Type targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException("one way converter");
        }
    }
    
    <TextBlock Text="{Binding Converter={StaticResource interface1Indexer}, ConverterParameter='abc'" />
    

    当然,绑定属性必须 public 而显式实现具有特殊的状态。这个问题可能有帮助: Why Explicit Implementation of a Interface can not be public?