如何正确绑定到 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(例如 Window
、UserControl
等)中查看这些项目,您需要使用可以显示列表的控件项目(一个派生自 ItemsControl
)和 bind 控制列表 属性,像这样:
<Window ... >
<StackPanel>
<ItemsControl ItemsSource="{Binding MyItems}" />
<TextBlock Text="{Binding MyItems.Count}" />
</StackPanel>
</Window>
ObservableCollection<T>
实现 INotifyPropertyChanged
所以 Count
属性 将始终反映列表中项目的实际数量.
当然,您不必拥有字符串列表,它们可以是任何类型的对象。同样,您不必使用 ItemsControl
,但可以使用 ListBox
或 ListView
之类的东西(它们都派生自该基本控件 class)。此外,您可能需要查看 data templating,因为这可用于更改 ItemsControl
.
中项目的视觉外观
我对绑定没有什么问题。我的 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(例如 Window
、UserControl
等)中查看这些项目,您需要使用可以显示列表的控件项目(一个派生自 ItemsControl
)和 bind 控制列表 属性,像这样:
<Window ... >
<StackPanel>
<ItemsControl ItemsSource="{Binding MyItems}" />
<TextBlock Text="{Binding MyItems.Count}" />
</StackPanel>
</Window>
ObservableCollection<T>
实现 INotifyPropertyChanged
所以 Count
属性 将始终反映列表中项目的实际数量.
当然,您不必拥有字符串列表,它们可以是任何类型的对象。同样,您不必使用 ItemsControl
,但可以使用 ListBox
或 ListView
之类的东西(它们都派生自该基本控件 class)。此外,您可能需要查看 data templating,因为这可用于更改 ItemsControl
.