我的绑定问题很少。我在我的xaml中有stackpanel,它有一些儿童集合中的元素。其次我有文本块,显示stackpanel中元素的数量。它通过这种方式绑定来完成
<TextBlock Text="{Binding Children.Count, ElementName=CommentsContainer, Mode=OneWay, StringFormat=({0})}" />
<StackPanel x:Name="CommentsContainer"></StackPanel>
它首次正常工作但是如果添加到stackpanel儿童集合中,则不会更新文本块文本。我的意思是收集计数没有实现inotifypropertychange,但是如何正确地做这样的事情?
答案 0 :(得分:4)
你问&#34;如何正确地做这样的事情&#34;。 WPF的方式是在Window
或ViewModel或其他任何内容上将项目集合实现为属性,然后将ItemsControl
绑定到该集合。
例如,如果您有一组字符串:
public ObservableCollection<string> MyItems { get; private set; }
// elsewhere in the same class...
MyItems = new ObservableCollection<string>();
MyItems.Add("first");
MyItems.Add("second");
MyItems.Add("etc");
ObservableCollection<T>
是一个很好的集合类,用于WPF,因为对集合所做的任何更改(例如添加或删除项目)的通知将被推送到集合的任何观察者(例如WPF&#39; s绑定系统)。
要在查看中查看这些项目(例如Window
,UserControl
等),您将使用可显示项目列表的控件(一个派生从ItemsControl
)和绑定控制到列表属性,如下所示:
<Window ... >
<StackPanel>
<ItemsControl ItemsSource="{Binding MyItems}" />
<TextBlock Text="{Binding MyItems.Count}" />
</StackPanel>
</Window>
ObservableCollection<T>
实施INotifyPropertyChanged
,因此Count
属性将始终反映列表中的实际项目数。
当然,您不必拥有字符串列表,它们可以是任何类型的对象。同样,您不必使用ItemsControl
,但可以使用类似ListBox
或ListView
的内容(它们都来自该基本控件类)。此外,您可能需要查看data templating,因为这可以用来更改ItemsControl
中项目的视觉外观。