c# - 如何将 StackPanel 绑定(bind)到非 ObservableCollection?

标签 c# wpf xaml data-binding

<StackPanel Orientation="Vertical" x:Name="stackPanel">
     <ItemsControl ItemsSource="{Binding C}">
          <ItemsControl.ItemTemplate>
             <DataTemplate>
                  <TextBlock Foreground="Black" Text="{Binding prop1}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
             </DataTemplate>
         </ItemsControl.ItemTemplate>
     </ItemsControl>
</StackPanel>

我用这段代码将这个堆栈面板绑定(bind)到一个列表

 List<C> list = new List<C>();
 for (int i = 0; i < 100; i++)
 {
     list.Add(new C() { prop1 = "prop" });
 }
 stackPanel.DataContext = list;

什么也没有发生。我们必须始终使用 ObservableCollection 吗?或者代码还有什么问题?

最佳答案

表达式 {Binding C} 没有意义,因为您将列表本身放入 DataContext 中。那么当然就没有属性C了。

您应该将其替换为:

<ItemsControl ItemsSource="{Binding}">

也就是说,您实际上并不是将 StackPanel 绑定(bind)到项目集合,而是绑定(bind)到 StackPanel 内的 ItemsControl。如果您打算将 StackPanel 用作 ItemsControl 的 ItemsPanel,您应该这样写:

<ItemsControl x:Name="itemsControl">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Vertical"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Foreground="Black" Text="{Binding prop1}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

并像这样设置 ItemsSource:

itemsControl.ItemsSource = list;

关于c# - 如何将 StackPanel 绑定(bind)到非 ObservableCollection?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33124325/

相关文章:

wpf - 默认输入和空格键行为 wpf 应用程序

WPF 鼠标忙图标

c# - 如何设置ListView的ItemsSource?

C# 动态类型语言

c# - StackExchange.Redis 如何仅在一个数据库上查询所有键

c# - 为什么我不能合并两个 JArray?

c# - WPF:将递归字典绑定(bind)到 TreeView

c# - C# 4 中 DLR 的优势是什么?

WPF:DataGrid.RowDetailsTemplate:仅在选择单行时显示详细信息?

c# - 绑定(bind)手势识别器