Свяжите с количеством объектов в DataContext

Я хочу связать с количеством/суммой объектов в моем DataContext.

У меня есть объект, позволяет, говорят, что человек, который имеет a List<address> как свойство. Я хотел бы отобразить сумму адресов для того человека т.е.: 5 или 6 или независимо от того, что случай может быть.

Я попробовал {Binding Path=address#.Count} и немногие другие, но это, кажется, не работает.

Любая справка ценилась бы, спасибо.

24
задан Organ Grinding Monkey 26 May 2010 в 20:33
поделиться

4 ответа

Вам нужно привязать имя свойства, а не его тип.

C #:

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

XAML:

{Binding Addresses.Count}

Предполагается, что ваш DataContext является объектом типа Person .

28
ответ дан 28 November 2019 в 23:12
поделиться

Чтобы расширить ответ 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;
        }
    }

}
1
ответ дан 28 November 2019 в 23:12
поделиться

Как говорит Мик, вы можете выполнить привязку, используя путь Addresses.Count .

Обратите внимание, однако, что если Адреса не являются ObservableCollection

или каким-либо другим типом, реализующим INotifyCollectionChanged , добавление и удаление адресов не будет влияет на число, которое появляется в пользовательском интерфейсе после его первоначального отображения. Если вам это нужно, вам нужно будет либо изменить тип коллекции в вашей модели представления (что проще всего), либо реализовать свойство в вашей модели представления, которое выставляет счетчик, и вызывать событие PropertyChanged каждые когда вы добавляете или удаляете адрес.

Править

Я люблю читать ответ, думая: «Эй, это неправильно», а потом понимаю, что написал его.

Если вы выполняете привязку к объекту, который просто реализует INotifyCollectionChanged , счетчик в пользовательском интерфейсе не изменится, если элементы добавляются или удаляются из коллекции. Объект также должен реализовать INotifyPropertyChanged и поднять PropertyChanged при изменении свойства Count .

Что, к счастью, делает ObservableCollection . Так что мой ответ не , что неверен.

18
ответ дан 28 November 2019 в 23:12
поделиться

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
    {
    }
}
3
ответ дан 28 November 2019 в 23:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: