如何正确绑定到WPF中的元素属性

时间:2015-01-28 13:10:11

标签: c# wpf xaml data-binding

我的绑定问题很少。我在我的xaml中有stackpanel,它有一些儿童集合中的元素。其次我有文本块,显示stackpanel中元素的数量。它通过这种方式绑定来完成

<TextBlock Text="{Binding Children.Count, ElementName=CommentsContainer, Mode=OneWay,  StringFormat=({0})}" />

<StackPanel x:Name="CommentsContainer"></StackPanel>

它首次正常工作但是如果添加到stackpanel儿童集合中,则不会更新文本块文本。我的意思是收集计数没有实现inotifypropertychange,但是如何正确地做这样的事情?

1 个答案:

答案 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绑定系统)。

要在查看中查看这些项目(例如WindowUserControl等),您将使用可显示项目列表的控件(一个派生从ItemsControl)和绑定控制到列表属性,如下所示:

<Window ... >
    <StackPanel>
        <ItemsControl ItemsSource="{Binding MyItems}" />
        <TextBlock Text="{Binding MyItems.Count}" />
    </StackPanel>
</Window>

ObservableCollection<T> 实施INotifyPropertyChanged,因此Count属性将始终反映列表中的实际项目数。

当然,您不必拥有字符串列表,它们可以是任何类型的对象。同样,您不必使用ItemsControl,但可以使用类似ListBoxListView的内容(它们都来自该基本控件类)。此外,您可能需要查看data templating,因为这可以用来更改ItemsControl中项目的视觉外观。