我有一个包含项目的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;。
答案 0 :(得分:0)
实际上,你写的东西应该做的工作。问题可能不在xaml中。
您说这些项目包含字段名称。 WPF只能绑定到公共属性确保使用它们,而不是公共成员。如果您在打开窗口后更改旧值,也可能会看到旧值。确保您的项目实现INotifyPropertyChanged
界面,并且属性调用OnPropertyChanged
。
如果您仍然遇到问题,请发布更多代码,特别是您的数据项类以及您设置SortDescriptor的位置。
最后,虽然它不是你问的问题。您可以使用/
运算符绑定到数组中的当前项。要使用您的代码:
<TextBlock Text="{Binding ElementName=list, Path=Items/Name}"/>
您可以控制&#34;当前&#34;项目使用CollectionViews
和IsSynchronizedWithCurrentItem
属性。