2010-05-26 9 views
20

Quiero enlazar al Recuento/cantidad de elementos dentro de mi DataContext.Enlazar con el conteo de elementos en el DataContext

Tengo un objeto, digamos persona que tiene un List<address> como una propiedad. Me gustaría mostrar la cantidad de direcciones para esa persona, es decir: 5 o 6 o cualquiera que sea el caso.

He intentado {Binding Path=address#.Count} y algunos otros, pero parece que no funciona.

Cualquier ayuda sería apreciada, gracias.

Respuesta

24

Debe enlazar el nombre de la propiedad, no su tipo.

C#:

public class Person 
{ 
    ... 
    public List<address> Addresses { get; set; } 
    ... 
} 

XAML:

{Binding Addresses.Count} 

Asumiendo que su DataContext es un objeto de tipo Person.

+0

pensé que la unión a Object.Value provoca pérdidas de memoria en WPF? – tcables

3

XAML:

<Window x:Class="CountDemo.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="CountDemo" Height="300" Width="300"> 
    <StackPanel> 
     <TextBlock Text="{Binding Path=Addresses.Count}" /> 
    </StackPanel> 
</Window> 

Código atrás:

using System.Collections.Generic; 
using System.Windows; 

namespace CountDemo 
{ 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 

      DataContext = new Person(); 
     } 
    } 

    public class Person 
    { 
     public List<Address> Addresses 
     { 
      get { return new List<Address>() {new Address(), new Address(), new Address()}; } 
     } 
    } 

    public class Address 
    { 
    } 
} 
1

Para ampliar tehMick's respuesta con código de ejemplo funcional:

XAML:

<Window x:Class="Sandbox.Wpf.PropertyCount.PropertyCount" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="Property Count" Height="300" Width="300"> 
    <StackPanel> 
     <ListView ItemsSource="{Binding Path=People}"> 
      <ListView.ItemTemplate> 
       <DataTemplate> 
        <Grid Margin="4"> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="Auto" /> 
          <ColumnDefinition Width="*" /> 
         </Grid.ColumnDefinitions> 
         <TextBlock Text="{Binding Path=Name}" Margin="3" /> 
         <TextBlock Grid.Column="1" Margin="3"> 
          <TextBlock Text="{Binding Path=Addresses.Count}" /> <Run>addresses</Run> 
         </TextBlock> 
        </Grid> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
     </ListView> 
    </StackPanel> 
</Window> 

código subyacente:

namespace Sandbox.Wpf.PropertyCount 
{ 
    /// <summary> 
    /// Interaction logic for PropertyCount.xaml 
    /// </summary> 
    public partial class PropertyCount : Window 
    { 

     public PropertyCount() 
     { 
      InitializeComponent(); 
      this.DataContext = new Model(); 
     } 
    } 

    public class Model 
    { 
     public List<Person> People { get; private set; } 

     public Model() 
     { 

      People = new List<Person>{ 
       new Person ("joe", new List<object> { 1, 2, 3 }), 
       new Person ("bob", new List<object> { 1, 2 }), 
       new Person ("kay", new List<object> { 1, 2, 3, 4, 5 }), 
       new Person ("jill", new List<object> { 1, 2, 3, 4 }), 
      }; 
     } 
    } 

    public class Person 
    { 
     public string Name { get; set; } 
     public List<object> Addresses { get; set; } 

     public Person(string name, List<object> addresses) 
     { 
      Name = name; 
      Addresses = addresses; 
     } 
    } 

} 
13

Como dice tehMick, puede enlazar con el camino Addresses.Count.

Nótese, sin embargo, que a menos que Addresses es un ObservableCollection<address>, o algún otro tipo que implementa INotifyCollectionChanged, adición y eliminación de direcciones no afectará al número que aparece en la interfaz de usuario después de su pantalla inicial. Si lo necesita, deberá cambiar el tipo de la colección en su modelo de vista (lo cual es más fácil) o implementar una propiedad en su modelo de vista que exponga el recuento y plantear el evento PropertyChanged cada vez que agregue o elimine un dirección.

Editar

Me encanta leer una respuesta, pensando: "bueno, eso no es correcto", y luego darse cuenta de que lo escribí.

Si se enlaza a un objeto que acaba de implementa INotifyCollectionChanged, el recuento en la interfaz de usuario no cambiará si se añaden o eliminan elementos ot la colección. El objeto también tiene que implementar INotifyPropertyChanged y aumentar PropertyChanged cuando cambia la propiedad Count.

que, afortunadamente, ObservableCollection<T> hace. Entonces mi respuesta no es que mal.

0

En mi caso, la respuesta de Robert me puso muy cerca de lo que estaba buscando. Sin embargo, estoy agregando muchos elementos a la lista de una llamada de servicio, y no quería que el evento se active para cada elemento. Con este fin, aproveché la funcionalidad ya está integrado en BindingList:

public class BindingListNotifyCount<T> : BindingList<T>, INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected override void OnListChanged(ListChangedEventArgs e) 
    { 
     base.OnListChanged(e); 
     RaisePropertyChanged("Count"); 
    } 

    protected void RaisePropertyChanged([CallerMemberName]string propertyName = "") => 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
} 

Entonces simplemente lo utilizan como:

displayItems.RaiseListChangedEvents = false; 
serviceItems.ForEach(item => displayItems.Add(item)); 
displayItems.RaiseListChangedEvents = true; 
displayItems.ResetBindings(); 
Cuestiones relacionadas