2009-08-26 5 views
0

У меня есть класс, как это:XAML: Привязка к одному ребенку в коллекции

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) связать StackPane l с номером ContestTeam в коллекции Teams, который соответствует значению ScheduleViewModel.TeamId?

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

+0

Вы можете создать 'IValueConverter' который происходит от 'DependencyObject' и имеет некоторый' DependencyProperty', который содержит 'Id' для' Silverlight'. – Mohsen

ответ

1

Невозможно сделать запросы в привязках 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> 
+0

Silverlight еще не поддерживает многопоточность - но я нашел эту ссылку: http: //www.scottlogic.co.uk/blog/wpf/2009/06/silverlight-multibindings-how-to-attached-mutiple-bindings-to -a-single-property/ –

+0

Как реализовать 'ConvertBack' – Mohsen

+0

Для большинства multibindings нет никакого способа воссоздать исходные два (или более) значения из окончательного, так что вы просто бросаете NotSupportedException, и все. Если вам нужна двусторонняя привязка, вам нужно точно описать, как вы ожидаете, что она будет работать, прежде чем на этот вопрос будет дан ответ. –

Смежные вопросы