2010-04-26 6 views
2

Je suis nouveau à Silverlight, donc je n'ai pas une compréhension complète de tous les contrôles à ma disposition. Ce que je voudrais faire est d'utiliser la liaison de données et un modèle de vue pour maintenir une collection d'éléments. Voici un code maquette de ce que je voudrais faire:Liaison de données Silverlight pour la collection dans le panneau de pile

Modèle

public class MyItem 
    { 
     public string DisplayText { get; set; } 
     public bool Enabled { get; set; } 
    } 

ViewModel

public class MyViewModel : INotifyPropertyChanged 
{ 
     private ObservableCollection<MyItem> _myItems = new ObservableCollection<MyItem>(); 
     public ObservableCollection<MyItem> MyItems 
     { 
      get { return _myItems; } 
      set 
      { 
       _myItems = value 
       NotifyPropertyChanged(this, "MyItems"); 
      } 
     } 
} 

Voir

<Grid x:Name="LayoutRoot" Background="White"> 
     <StackPanel ItemsSource="{Binding MyItems}">    
      <StackPanel Orientation="Horizontal"> 
       <CheckBox "{Binding Enabled, Mode=TwoWay}"></CheckBox> 
       <TextBlock Text="{Binding DisplayText, Mode=TwoWay}" /> 
      </StackPanel>     
     </StackPanel>   
    </Grid> 

Donc mon but final serait que chaque fois que j'ajoute un autre MyItem à la collection MyItems cela créerait un nouveau StackPanel avec checkbox et textblock. Je n'ai pas besoin d'utiliser un panneau de pile, mais j'ai juste pensé que je l'utiliserais pour cet exemple.

Répondre

5

On dirait que vous voulez un <ListBox>, puis définissez le <ListBox.ItemTemplate> à votre <StackPanel> quelque chose comme ça .....

<ListBox ItemsSource=”{Binding Classes, Source={StaticResource model}}”>   
    <ListBox.ItemTemplate>    
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <CheckBox "{Binding Enabled, Mode=TwoWay}"/> 
       <TextBlock Text="{Binding DisplayText, Mode=TwoWay}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

here is a great example (il est WPF, mais ne devrait être des changements mineurs pour silverlight)

+0

Merci! C'est une solution très propre, et j'aime aussi comment vous avez intégré le modèle de données dans la propriété ListBox.ItemTemplate. Je n'avais pas pensé à le faire de cette façon. –

+0

heureux d'aider. bien sûr, vous n'avez pas ** à ** le mettre dans le modèle d'objet de cette façon - vous pourriez aussi définir un DataTemplate pour votre type. –

1

oui, on dirait que vous voulez un <ListBox>

<UserControl 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
x:Class="SilverlightApplication4.MainPage" 
Width="640" Height="480"> 
<UserControl.Resources> 
    <DataTemplate x:Key="ItemTemplate"> 
     <StackPanel Orientation="Horizontal"> 
      <CheckBox IsChecked="{Binding Enabled, Mode=TwoWay}"/> 
      <TextBlock Text="{Binding DisplayText}"/> 
     </StackPanel> 
    </DataTemplate> 
</UserControl.Resources> 
<Grid x:Name="LayoutRoot" Background="White" DataContext="{Binding Source={StaticResource SampleDataSource}}"> 
    <ListBox Margin="0,0,8,0" ItemTemplate="{StaticResource ItemTemplate}" ItemsSource="{Binding Collection}"/> 
</Grid> 

Ce code vous donnera un ListBox avec toutes vos données liées à une case à cocher et TextBlock avec la case à cocher d'abord et TextBox à côté de lui.

Questions connexes