Как заполнить элементы списка XAML из метода, который требует один аргумент? - PullRequest
1 голос
/ 12 июля 2010

Итак, у меня есть список:

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

Что я хотел бы сделать, это установить источник данных элемента в список адресов, каждый из которых имеет одинаковый почтовый индекс.Поэтому мне нужен список текущих адресов в наблюдаемой коллекции с тем же почтовым индексом.Для генерации такого списка адресов потребуется только вызов метода, который принимает текущий почтовый индекс в качестве аргумента, но я не знаю, как вызвать метод, который требует аргумента из статического источника данных.

Кто-нибудь может помочь?

1 Ответ

1 голос
/ 13 июля 2010

Создание представления со свойством Collection и свойством PostCode.Свяжите PostCode TwoWay, позвольте установщику поднять OnPropertyChanged для свойства Collection и дайте свойству collection вернуть коллекцию на основе текущего значения свойства 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>

Примечание: Мой класс "Адрес" может отличаться от вашего.

...