XAML: se lier à un seul enfant dans une collection

voix
0

J'ai une classe comme ceci:

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

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

Et mon modèle de vue ressemble à ceci:

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

Mon XAML ressemble à ceci:

<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>

Pour l' essentiel, donc je peux continuer à développer , j'ai créé un convertisseur de valeur (CurrentTeam) et le disque codé TeamIdcomme pour ConverterParameterque je puisse continuer à développer la vue. Mais je suis un peu d'une impasse. Est - il possible ( en utilisant XAML) pour lier le DataContextdu StackPanel à ContestTeamla Teamscollection qui correspond à la valeur ScheduleViewModel.TeamId?

Mon dernier recours sera d'utiliser simplement l' Loadedévénement du StackPanelà régler est DataContextdans le code-behind, mais je voudrais éviter cela. Y at - il XAML Ninjas là - bas qui peuvent me aider à cela?

Créé 26/08/2009 à 22:33
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
1

Il n'y a pas moyen de faire des requêtes dans les liaisons XAML. Dans ce cas, puisque vous avez vraiment deux valeurs d' entrée ( Teamset CurrentTeamId), il suffit d' utiliser un MultiBindinget 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
    ...
}

puis XAML:

<StackPanel>
  <StackPanel.DataContext>
    <MultiBinding Converter="{StaticResource FindContestByIdConverter}">
      <Binding Path="Teams"/>
      <Binding Path="CurrentTeamId" />
    </MultiBinding>
  </StackPanel.DataContext>
  ...
</StackPanel>
Créé 26/08/2009 à 23:05
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more