XAML: привязка к одному ребенку в коллекции - PullRequest
0 голосов
/ 27 августа 2009

У меня есть такой класс:

public class Contest {
    List<ContestTeam> Teams { get; set; }
}

public class ContestTeam {
    int TeamId { get; set; }
    int FinalScore { get; set; }
}

И моя модель зрения выглядит так:

public class ScheduleViewModel {
    int CurrentTeamId { get; }
    List<Contest> Schedule { get; }
}

Мой XAML выглядит примерно так:

<ListBox ItemsSource="{Binding Path=Schedule}">
    <ListBox.ItemTemplate>
        <DataTemplate>

            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition  />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition />
                    <RowDefinition />
                </Grid.RowDefinitions>

                <StackPanel Grid.Row="0" Orientation="Horizontal">
                    <!-- TODO: DataContext is currently hard coded to 425 - this needs to be fixed -->
                    <StackPanel Orientation="Horizontal" 
                            DataContext="{Binding Path=Teams, Converter={StaticResource CurrentTeam}, ConverterParameter=425}">

                        <TextBlock Text="{Binding SomeProperty}" />
                    </StackPanel>

                    <Button Content="Delete" />
                </StackPanel>

                <ListBox Grid.Row="1" ItemsSource="{Binding Teams}">
                    <!-- a list of all the teams -->
                </ListBox>
            </Grid>

        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

По сути, чтобы я мог продолжить разработку, я создал преобразователь значений (CurrentTeam) и жестко закодировал TeamId как ConverterParameter, чтобы я мог продолжить разработку представления. Но я в тупике. Есть ли способ (с использованием XAML) связать DataContext из StackPane l с ContestTeam в коллекции Teams, которая соответствует значению ScheduleViewModel.TeamId?

Моим последним выходом будет просто использовать Loaded событие StackPanel, чтобы установить его DataContext в коде, но я бы хотел этого избежать. Есть ли там ниндзя XAML, которые могут помочь мне понять это?

1 Ответ

1 голос
/ 27 августа 2009

Нет способа делать запросы в привязках XAML. В этом случае, поскольку у вас действительно есть два значения ввода (Teams и CurrentTeamId), просто используйте MultiBinding и IMultiValueConverter:

public class FindContestByIdConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType,
                          object parameter, CultureInfo culture)
    {
        var teams = (IEnumerable<ContestTeam>)values[0];
        var teamId = (int)values[1];
        return teams.Single(t => t.TeamId == teamId);
    }

    // ConvertBack that throws NotSupportedException
    ...
}

, а затем XAML:

<StackPanel>
  <StackPanel.DataContext>
    <MultiBinding Converter="{StaticResource FindContestByIdConverter}">
      <Binding Path="Teams"/>
      <Binding Path="CurrentTeamId" />
    </MultiBinding>
  </StackPanel.DataContext>
  ...
</StackPanel>
...