2010-07-12 5 views
1

J'ai donc Listbox:Comment puis-je renseigner les éléments Xbox Listbox à partir d'une méthode nécessitant un seul argument?

<ListBox Grid.Row="0" Grid.Column="1" Grid.RowSpan="2"> //<----Item's Data Source Method Call Here? 
    <ListBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <VirtualizingStackPanel 
      Orientation="Horizontal" 
      IsItemsHost="true" /> 
     </ItemsPanelTemplate> 
    </ListBox.ItemsPanel> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Grid.Row="0" Grid.Column="1" Grid.RowSpan="2" Orientation="Vertical"> 
      <Label Content="{Binding Address1}"></Label> 
      <Label Content="{Binding Address2}"></Label> 
      <Label Content="{Binding Town}"></Label> 
      <Label Content="{Binding Postcode}"></Label> 
      <Label Content="{Binding Country}"></Label> 
      <CheckBox Content="{Binding Include}"></CheckBox> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Ce que je voudrais faire est réglé sur une liste d'adresses qui sont tous de la source de données de l'élément ont le même code postal. J'ai donc besoin d'une liste des adresses actuelles dans une collection observable avec le même code postal. Pour générer une telle liste d'adresses, il suffit de passer un appel à une méthode qui accepte le code postal actuel en tant qu'argument mais je ne sais pas comment appeler une méthode nécessitant un argument provenant d'une source de données statique.

Quelqu'un peut-il aider?

Répondre

1

Créez une vue avec une propriété Collection et une propriété PostCode. Liez le PostCode TwoWay, laissez le setter lever OnPropertyChanged pour la propriété Collection et laissez la propriété de collection retourner une collection basée sur la valeur actuelle de la propriété PostCode.

internal class MyView : INotifyPropertyChanged { 
    private string _postCode; 

    public string PostCode { 
     get { return _postCode; } 
     set { 
     _postCode = value; 
     OnPropertyChanged("PostCode"); 
     OnPropertyChanged("FilteredItems"); 
     } 
    } 

    public ObservableCollection<Address> Items { get; set; } 

    public IEnumerable<Address> FilteredItems { 
     get { return Items.Where(o => o.PostCode == _postCode).ToArray(); } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string propertyName) { 
     if(PropertyChanged != null) { 
     PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

<Grid DataContext="{Binding Path=myViewInstance}"> 
    <TextBox Text="{Binding Path=PostCode, Mode=TwoWay}"/> 
    <ListBox Grid.Row="0" Grid.Column="1" Grid.RowSpan="2" ItemsSource="{Binding Path=FilteredItems}"> 
     <ListBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <VirtualizingStackPanel 
       Orientation="Horizontal" 
       IsItemsHost="true" /> 
     </ItemsPanelTemplate> 
     </ListBox.ItemsPanel> 
     <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Grid.Row="0" Grid.Column="1" Grid.RowSpan="2" Orientation="Vertical"> 
       <Label Content="{Binding Address1}"></Label> 
       <Label Content="{Binding Address2}"></Label> 
       <Label Content="{Binding Town}"></Label> 
       <Label Content="{Binding PostCode}"></Label> 
       <Label Content="{Binding Country}"></Label> 
       <CheckBox Content="{Binding Include}"></CheckBox> 
      </StackPanel> 
     </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
</Grid> 

Note: Ma classe "Adresse" peut différer de la vôtre.

+0

Je vais certainement essayer cela. Merci! – bert

+0

Pas de problème .. si ça aide, n'hésitez pas à voter moi ;-) – PjL

+0

Ironiquement, je ne peux pas voter comme je n'ai pas de compte. Mais vous obtiendrez certainement la grosse tique verte si elle est payante! – bert

Questions connexes