WPF XAML-массив привязки с переменным индексом

Я хотел бы сделать привязку данных с массивом :

<Button x_Name="ButtonMap" Content="{Binding Tag[0], RelativeSource={RelativeSource  AncestorType={x:Type ItemsControl}}}">

Это работает.

Но, моя кнопка находится в ItemsControl и мне удалось получить индекс текущего элемента, как это :

{Binding Path=(ItemsControl.AlternationIndex), 
            RelativeSource={RelativeSource TemplatedParent}, 
            StringFormat={}Index is {0}}

Теперь я бы использовал этот индекс, чтобы получить N-й элемент моего массива. Как это :

<Button x_Name="ButtonMap" Content="{Binding Tag[index], RelativeSource={RelativeSource  AncestorType={x:Type ItemsControl}}}">

Я пытался использовать StaticResource, но привязка не работала.

Вы можете мне помочь ?

РЕДАКТИРОВАТЬ :
файл XAML :

`<UserControl x_Class="INSAWorldWPF.Views.GameView"
         
         
          
         
         
         
         
         
         mc_Ignorable="d" 
         d_DesignHeight="300" d_DesignWidth="300">
<UserControl.Background>
    <ImageBrush ImageSource="/Views/Resources/background2.jpg"/>
</UserControl.Background>

<!--<Button Height="50" Margin="0,30" Command="{Binding TestCommand, Mode=OneWay}" Content="Demo Map"/>-->
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1*"/>
            <ColumnDefinition Width="2*"/>
        </Grid.ColumnDefinitions>

        <StackPanel Grid.Column="0" VerticalAlignment="Center" Margin="30,0,0,0">
            <StackPanel.Background>
                <SolidColorBrush Color="Gray" Opacity=".3"/>
            </StackPanel.Background>
            <Image Source="{Binding ImageRace}" Width="200" Height="200" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0,20" />
            <TextBlock Text="{Binding PseudoCurrentPlayer}" FontFamily="pack://application:,,,/Views/Resources/#Ringbearer Medium" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="60"/>
            <StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center">
                <TextBlock HorizontalAlignment="Center" FontFamily="pack://application:,,,/Views/Resources/#Cosmic Love" VerticalAlignment="Center" FontSize="40" Text="LifePoint : "/>
                <TextBlock HorizontalAlignment="Center" FontFamily="pack://application:,,,/Views/Resources/#Cosmic Love" VerticalAlignment="Center" FontSize="40" Text="{Binding LifePoint}"/>
            </StackPanel>
            <StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center">
                <TextBlock HorizontalAlignment="Center" FontFamily="pack://application:,,,/Views/Resources/#Cosmic Love" VerticalAlignment="Center" FontSize="40" Text="MovePoint : "/>
                <TextBlock HorizontalAlignment="Center" FontFamily="pack://application:,,,/Views/Resources/#Cosmic Love" VerticalAlignment="Center" FontSize="40" Text="{Binding MovePoint}"/>
            </StackPanel>
        </StackPanel>

            <StackPanel Grid.Column="1" VerticalAlignment="Center" Margin="30,0">
            <StackPanel.Background>
                <SolidColorBrush Color="Gray" Opacity=".3"/>
            </StackPanel.Background>

        <ItemsControl ItemsSource="{Binding ListTile}" AlternationCount="150" Tag="{Binding UnitByTile}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <DataTemplate.Resources>
                        <custom:TypeOfConverter x_Key="typeOfConverter" />
                        <System:Double x_Key="theMargin">0</System:Double>
                    </DataTemplate.Resources>
                    <Button x_Name="ButtonMap" Content="{Binding Path=Tag[?????????], RelativeSource={RelativeSource  AncestorType={x:Type ItemsControl}}}">

                        <Button.Resources>

                        </Button.Resources>
                        <Button.Style>
                            <Style TargetType="Button">
                                <Setter Property="Template">
                                    <Setter.Value>
                                        <ControlTemplate TargetType="{x:Type Button}">
                                            <Border Background="{TemplateBinding Background}" BorderBrush="Black" BorderThickness="1">
                                                <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                                            </Border>
                                            <ControlTemplate.Triggers>
                                                <Trigger Property="IsMouseOver" Value="True">
                                                    <Setter Property="Opacity" Value="1" />
                                                </Trigger>
                                                <Trigger Property="IsMouseOver" Value="False">
                                                    <Setter Property="Opacity" Value="0.7" />
                                                </Trigger>
                                            </ControlTemplate.Triggers>
                                        </ControlTemplate>
                                    </Setter.Value>
                                </Setter>
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding ., Converter={StaticResource typeOfConverter} }" Value="Desert">
                                        <Setter Property="Background" Value="Yellow" />
                                    </DataTrigger>
                                    <DataTrigger Binding="{Binding ., Converter={StaticResource typeOfConverter} }" Value="Swamp">
                                        <Setter Property="Background" Value="DarkKhaki" />
                                    </DataTrigger>
                                    <DataTrigger Binding="{Binding ., Converter={StaticResource typeOfConverter} }" Value="Volcano">
                                        <Setter Property="Background" Value="Red" />
                                    </DataTrigger>
                                    <DataTrigger Binding="{Binding ., Converter={StaticResource typeOfConverter} }" Value="Plain">
                                        <Setter Property="Background" Value="ForestGreen" />
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </Button.Style>
                    </Button>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <UniformGrid Columns="{Binding SizeMap}" Rows="{Binding SizeMap}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="600"/>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
            </ItemsControl>
        </StackPanel>
    </Grid>

`

1 ответ

  1. Я бы рекомендовал использовать a MultiValueConverter. Предполагая, что Tag[]это типstring[], вы могли бы использовать следующее:

    public class ArrayItemSelector : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            //Check given arguments first
            if(!(values.Length > 1) || !(values[0] is string[]) || !(values[1] is int))
                throw new ArgumentException("given values not correct");
    
            return ((string[]) values[0])[(int) values[1]];
        }
    
        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    

    использование:

    <Grid.Resources>
        <namespace:ArrayItemSelector x_Key="ArrayItemSelector" />
    </Grid.Resources>
    <!-- .................. -->
    <Button x_Name="ButtonMap">
        <Button.Content>
             <MultiBinding Converter="{StaticResource ArrayItemSelector}">
                 <Binding Path="Tag" RelativeSource="{RelativeSource  AncestorType={x:Type ItemsControl}}" />
                 <Binding Path="(ItemsControl.AlternationIndex)" RelativeSource="{RelativeSource TemplatedParent}" />
             </MultiBinding>
        </Button.Content>
    </Button>
    

    Простой ValueConverterне будет работать, потому ConverterParameterчто должен быть статичным. Индекс, который вы хотите использовать, должен быть привязан.

    Надеюсь, это работает для вас