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

How to properly bind to element property in WPF

我对绑定没有什么问题。我的 xaml 中有堆栈面板,其中包含子集合中的一些元素。其次,我有显示堆栈面板中元素计数的文本块。它是通过绑定方式完成的

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

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

第一次使用时效果很好,但如果将某些内容添加到堆栈面板子集合中,则动态文本块文本不会更新。我的意思是集合计数没有实现 inotifypropertychange,但是如何正确地做这样的事情?

你问了"how [to] do something like this properly"。 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> 是一个很好的集合 class 用于 WPF 因为对集合所做的任何更改(例如添加或删除项目)的通知将被推送到集合的任何观察者(比如WPF的绑定系统)。

要在 View(例如 WindowUserControl 等)中查看这些项目,您需要使用可以显示列表的控件项目(一个派生自 ItemsControl)和 bind 控制列表 属性,像这样:

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

ObservableCollection<T> 实现 INotifyPropertyChanged 所以 Count 属性 将始终反映列表中项目的实际数量.

当然,您不必拥有字符串列表,它们可以是任何类型的对象。同样,您不必使用 ItemsControl,但可以使用 ListBoxListView 之类的东西(它们都派生自该基本控件 class)。此外,您可能需要查看 data templating,因为这可用于更改 ItemsControl.

中项目的视觉外观