Я хочу связать с количеством/суммой объектов в моем DataContext.
У меня есть объект, позволяет, говорят, что человек, который имеет a List<address>
как свойство. Я хотел бы отобразить сумму адресов для того человека т.е.: 5 или 6 или независимо от того, что случай может быть.
Я попробовал {Binding Path=address#.Count}
и немногие другие, но это, кажется, не работает.
Любая справка ценилась бы, спасибо.
Вам нужно привязать имя свойства, а не его тип.
C #:
public class Person
{
...
public List<address> Addresses { get; set; }
...
}
XAML:
{Binding Addresses.Count}
Предполагается, что ваш DataContext
является объектом типа Person
.
Чтобы расширить ответ tehMick с функциональным примером кода:
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>
Отложенный код:
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;
}
}
}
Как говорит Мик, вы можете выполнить привязку, используя путь Addresses.Count
.
Обратите внимание, однако, что если Адреса
не являются ObservableCollection
или каким-либо другим типом, реализующим INotifyCollectionChanged
, добавление и удаление адресов не будет влияет на число, которое появляется в пользовательском интерфейсе после его первоначального отображения. Если вам это нужно, вам нужно будет либо изменить тип коллекции в вашей модели представления (что проще всего), либо реализовать свойство в вашей модели представления, которое выставляет счетчик, и вызывать событие PropertyChanged
каждые когда вы добавляете или удаляете адрес.
Править
Я люблю читать ответ, думая: «Эй, это неправильно», а потом понимаю, что написал его.
Если вы выполняете привязку к объекту, который просто реализует INotifyCollectionChanged
, счетчик в пользовательском интерфейсе не изменится, если элементы добавляются или удаляются из коллекции. Объект также должен реализовать INotifyPropertyChanged
и поднять PropertyChanged
при изменении свойства Count
.
Что, к счастью, делает ObservableCollection
. Так что мой ответ не , что неверен.
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>
Код, стоящий за:
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
{
}
}