2009-03-13 5 views
1

In ASP.NET, so findet man sich das Schreiben von Code oft wie:Iterieren ein Silverlight Datagrid

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

In Silverlight, wie kann man die konstituierenden Steuerelemente eines Datagrid durchlaufen (oder andere Steuer Sammlung gebunden ist)? Ich möchte die Deckkraft für jedes zu etwas wie 0,5 und dann, wie sie verarbeitet werden die Deckkraft auf 1 zu aktualisieren.

Mit der ItemSource-Eigenschaft kann man einen Verweis auf die zugrunde liegende IEnumerable, die gebunden ist, erhalten, aber ich würde wie die eigentliche Kontrollreferenz.

Um diesen zu konkretisieren, vorausgesetzt, dass Sie ein Benutzersteuer wie diese:

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

Ihre Datagrid-Vorlage wie folgt aussieht:

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

Du bist wie diese Bindung:

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

Antwort

1

Ich würde Ihr Problem nähern, indem Sie einen Konverter für die Opazität-Eigenschaft verwenden. Lassen Sie mich erklären.

Die nette Art des Silverlight-Ansatzes zur Datenbindung ist die Kommunikation vom Modell zum UI. Dies wird durch Verwenden einer ObservableCollection anstelle einer Liste für Bindungslisten erreicht, die die Benutzeroberfläche ändern, oder durch Implementieren von INotifyPropertyChanged für Objekte mit Eigenschaften, die die Benutzeroberfläche ändern.

Dadurch können Sie Code vermeiden, der UI-Probleme analysiert und ändert.

Im Grunde würden Sie alle Daten, die Sie wissen müssen, um die Opazität zu ändern, mit Datenbanden versehen und sich darauf verlassen, dass der Konverter den Opazitätswert basierend auf dem datengebundenen Wert zurückgibt. Süss!

0

Vielleicht können Sie ein "Loaded" -Ereignis für Ihr UserControl hinzufügen, dann können Sie die Steuerreferenz auf diese Weise erhalten: 'TestControl testCtl = Absender als TestControl;'