WPF:绑定到已排序的ListView中的第一个项目

时间:2014-05-08 12:23:33

标签: wpf listview sorting binding

我有一个包含项目的ListView,其中包含字符串字段Name等。 ListView中的项目按此字段排序:

SortDescription descr = new SortDescription("Name", ListSortDirection.Ascending);
list.Items.SortDescriptions.Add(descr);

我还有一个TextBlock,我想在其中显示已排序的ListView中第一个项目的名称。可以在运行时添加,删除和编辑项目,所以我想使用某种类型的绑定,例如下面的那些(例如,没有工作):

<TextBlock Text="{Binding ElementName=list, Path=Items[0].Name}"/>

1)如何使用绑定实现所需的行为?

2)如果不能创建这样的绑定,这是最方便的成功方式吗?

任何想法和提示都将不胜感激。

更新

主窗口的内容:

<StackPanel>
    <TextBlock Name="nameFirst" Text="{Binding ElementName=list, Path=Items[0].Name}"/>
    <ListView Name="list" ItemsSource="{Binding ElementName=mainWnd, Path=List}" DisplayMemberPath="Name" Loaded="list_Loaded"/>
</StackPanel>

代码背后:

public partial class MainWindow : Window, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    public class Item : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }

        public Item(string name)
        {
            Name = name;
        }

        private string _name;
        public string Name
        {
            get { return _name; }
            set 
            {
                _name = value;
                OnPropertyChanged("Name");
            }
        }
    }

    public ObservableCollection<Item> _list;
    public ObservableCollection<Item> List
    {
        get { return _list; }
        set 
        { 
            _list = value;
            OnPropertyChanged("List");
        }
    }

    public MainWindow()
    {
        InitializeComponent();

        List = new ObservableCollection<Item>();
        List.Add(new Item("1"));
        List.Add(new Item("2"));
        List.Add(new Item("3"));
    }

    private void list_Loaded(object sender, RoutedEventArgs e)
    {
        SortDescription descr = new SortDescription("Name", ListSortDirection.Descending);
        list.Items.SortDescriptions.Add(descr);
    }
}

启动应用程序时,ListView中的项目按降序排序:&#34; 3&#34;,&#34; 2&#34;,&#34; 1&#34;,但是nameFirst TextBox仍显示&#34; 1&#34;,但现在它应显示&#34; 3&#34;。

1 个答案:

答案 0 :(得分:0)

实际上,你写的东西应该做的工作。问题可能不在xaml中。

您说这些项目包含字段名称。 WPF只能绑定到公共属性确保使用它们,而不是公共成员。如果您在打开窗口后更改旧值,也可能会看到旧值。确保您的项目实现INotifyPropertyChanged界面,并且属性调用OnPropertyChanged

如果您仍然遇到问题,请发布更多代码,特别是您的数据项类以及您设置SortDescriptor的位置。

最后,虽然它不是你问的问题。您可以使用/运算符绑定到数组中的当前项。要使用您的代码:

<TextBlock Text="{Binding ElementName=list, Path=Items/Name}"/>

您可以控制&#34;当前&#34;项目使用CollectionViewsIsSynchronizedWithCurrentItem属性。