XAML: se ligam a uma única criança em uma coleção

votos
0

Eu tenho uma classe como este:

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

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

E o meu modelo de vista se parece com isso:

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

Meu XAML é algo como isto:

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

Essencialmente, de modo que pode continuar a desenvolver Criei um conversor de valor (CurrentTeam) e codificado o TeamIdcomo o ConverterParametermodo I podem continuar a desenvolver a vista. Mas eu estou em um pouco de um impasse. Existe uma maneira (usando XAML) para vincular o DataContextdo StackPanel do ContestTeamna Teamscoleção que corresponda ao valor de ScheduleViewModel.TeamId?

Meu último recurso será usar apenas o Loadedcaso de StackPanelconfigurá-lo é DataContextno código-behind, mas eu gostaria de evitar isso. Há algum Ninjas XAML lá fora que pode me ajudar a descobrir isso?

Publicado 26/08/2009 em 22:33
fonte usuário
Em outras línguas...                            


1 respostas

votos
1

Não há nenhuma maneira de fazer consultas em ligações XAML. Neste caso, uma vez que você realmente tem dois valores de entrada ( Teamse CurrentTeamId), basta usar um MultiBindinge uma 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
    ...
}

e depois XAML:

<StackPanel>
  <StackPanel.DataContext>
    <MultiBinding Converter="{StaticResource FindContestByIdConverter}">
      <Binding Path="Teams"/>
      <Binding Path="CurrentTeamId" />
    </MultiBinding>
  </StackPanel.DataContext>
  ...
</StackPanel>
Respondeu 26/08/2009 em 23:05
fonte usuário

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