【问题标题】:Bind ItemsControl with ItemsSource to the array index将 ItemsControl 与 ItemsSource 绑定到数组索引
【发布时间】:2010-12-21 01:52:06
【问题描述】:

我想使用 ItemsSource 和 DataTemplate 将 ItemsControl 绑定到对象数组。 我想显示每个项目的索引。 喜欢

客户 1:

姓名:xxx

年龄:888

客户 2:

姓名:yyy

年龄:7777

【问题讨论】:

    标签: wpf arrays binding indexing itemscontrol


    【解决方案1】:

    最简单的方法是给你的类添加一个 Index 属性 ;-) 否则可以使用 MultiValueConverter 来完成:

    <Window x:Class="IndexSpike.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="300" Width="300"
        xmlns:Converters="clr-namespace:IndexSpike"
        xmlns:diag="clr-namespace:System.Diagnostics;assembly=WindowsBase"
        Name="Root"
        >
        <Window.Resources>
            <Converters:GetIndex x:Key="GetIndexConverter"/>
        </Window.Resources>
        <StackPanel>
            <ItemsControl ItemsSource="{Binding Persons}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <TextBlock Margin="0,5,0,0">
                            <TextBlock.Text>
                                <MultiBinding Converter="{StaticResource
                                                GetIndexConverter}"
                                                StringFormat="Index: {0}">
                                    <Binding Path="."/>
                                    <Binding ElementName="Root" Path="Persons"/>
                                </MultiBinding>
                            </TextBlock.Text>
                            </TextBlock>
                            <TextBlock Text="{Binding Name, StringFormat='Name: {0}'}"/>
                            <TextBlock Text="{Binding Age, StringFormat='Age {0}'}"/>
                        </StackPanel>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </StackPanel>
    </Window>
    
    using System;
    using System.Collections.ObjectModel;
    using System.Globalization;
    using System.Windows;
    using System.Windows.Data;
    
    namespace IndexSpike
    {
        public partial class Window1 : Window
        {
            public ObservableCollection<Person> Persons { get; set; }
    
            public Window1()
            {
                Persons=new ObservableCollection<Person>
                            {
                                new Person("Me",20),
                                new Person("You",30)
                            };
                InitializeComponent();
                DataContext = this;
            }
        }
    
        public class Person
        {
            public Person(string name,int age)
            {
                Name = name;
                Age=age;
            }
    
            public string Name { get; set; }
            public int Age { get; set; }
        }
    
        public class GetIndex:IMultiValueConverter
        {
            #region Implementation of IMultiValueConverter
    
            public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
            {
                var persons = (ObservableCollection<Person>) values[1];
                var person = (Person) values[0];
                return persons.IndexOf(person);
            }
    
            public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
            {
                throw new NotImplementedException();
            }
    
            #endregion
        }
    }
    

    感谢this question我找到了另一种声明MultiBinding的方法:

    <MultiBinding Converter="{StaticResource GetIndexConverter}"
                                              StringFormat="Index: {0}">
         <Binding Path="."/>
         <Binding RelativeSource="{RelativeSource FindAncestor,
                                      AncestorType={x:Type ItemsControl}}" 
                                      Path="DataContext.Persons"/>
    </MultiBinding>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-24
      • 2017-01-21
      相关资源
      最近更新 更多