2009-03-13 6 views
1

Dans ASP.NET, on se retrouve souvent à écrire du code comme:Itère un DataGrid Silverlight

foreach(DataListItem item in theDataList.Items){ 
    MyUserControl foo = item.FindControl("myUserControl") as MyUserControl; 
    foo.DoSomethingNice(); 
} 

Dans Silverlight, comment peut-on itérer à travers les contrôles constitutifs d'un DataGrid (ou toute autre collection contrôle lié)? Je voudrais définir l'opacité pour chacun à quelque chose comme 0.5 et puis comme ils sont traités mettre à jour l'opacité à 1.

En utilisant la propriété ItemSource on peut obtenir une référence à l'IEnumerable sous-jacent qui est lié, mais je voudrais comme la référence de contrôle réelle.

Pour rendre cela plus concret, supposons que vous avez un contrôle utilisateur comme ceci:

<UserControl x:Class="GridTest.TestControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="Auto" Height="25"> 
    <StackPanel Orientation="Horizontal"> 
     <TextBox Width="150" Text="{Binding FirstName}" /> 
     <TextBox Width="150" Text="{Binding LastName}" /> 
    </StackPanel> 
</UserControl> 

Votre modèle DataGrid ressemble:

<data:DataGrid x:Name="theDataGrid"> 
      <data:DataGrid.Columns> 
       <data:DataGridTemplateColumn Header="People" Width="Auto"> 
        <data:DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <this:TestControl /> 
         </DataTemplate> 
        </data:DataGridTemplateColumn.CellTemplate> 
       </data:DataGridTemplateColumn> 
      </data:DataGrid.Columns> 
     </data:DataGrid> 

Vous lier comme ceci:

theDataGrid.AutoGenerateColumns = false; 
people = new List<Person>( 
    new Person[]{ 
       new Person { FirstName = "John", LastName = "Carmack" }, 
       new Person { FirstName = "Linus", LastName = "Torvalds" } 
    } 
); 
theDataGrid.ItemsSource = people; 

Répondre

1

Je voudrais aborder votre problème en utilisant un convertisseur sur la propriété opacity. Laisse-moi expliquer.

La gentillesse dans l'approche Silverlight à la liaison de données est la communication du modèle à l'interface utilisateur. Cela est accompli en utilisant un ObservableCollection au lieu d'une liste pour les listes de liaison qui modifient l'interface utilisateur ou en implémentant INotifyPropertyChanged pour les objets avec des propriétés qui modifient l'interface utilisateur.

Cela vous permet d'éviter le code qui analyse et modifie les problèmes d'interface utilisateur. Fondamentalement, vous devez databind toutes les données que vous devez savoir pour modifier l'opacité, et compter sur le convertisseur pour retourner la valeur d'opacité basée sur la valeur de la base de données. Doux!

0

Peut-être que vous pouvez ajouter un événement 'Loaded' pour votre UserControl, alors vous pouvez obtenir la référence de contrôle de cette façon: 'TestControl testCtl = sender as TestControl;'

Questions connexes