【问题标题】:WPF binding to a number of objects only known at runtimeWPF 绑定到一些仅在运行时知道的对象
【发布时间】:2021-12-19 21:10:45
【问题描述】:

我试图了解 WPF 中绑定的限制(如果有的话)。我了解如何绑定到 XAML 中预定义数量的对象,例如:

<Grid>
   <Grid.RowDefinitions>
       <RowDefinition Height="Auto"/>
       <RowDefinition Height="Auto"/>
   </Grid.RowDefinitions>

   <Grid.ColumnDefinitions>
       <ColumnDefinition/>
       <ColumnDefinition/>
   </Grid.ColumnDefinitions>

   <TextBlock Text="{Binding MyText}" Grid.Row="1" Grid.Column="0"/>
</Grid>

(我以 TextBlock 为例,它可以是 Button 或任何其他元素) 现在,假设我需要显示其中的一些而不是单个 TextBlock,但确切的数字只有在运行时才能知道,以及要写入每个 TextBlock 的文本(以及可能的其他属性,我可能想绑定)。这在实践中可以实现吗?

【问题讨论】:

标签: wpf binding


【解决方案1】:

要在 WPF 中显示多个项目,您通常会使用基类 ItemsControl 或派生自它的类之一。这是继承层次结构图,当您只需要基本功能时可以使用ItemsControl,当您需要更多功能时可以使用它的派生类之一:

ItemsControl 及其子项提供了一个ItemsSource 属性,允许您绑定您的集合(通常是ObservableCollection)。但是,对于用户定义的类型,您还需要提供一个数据模板来告诉控件如何显示内容。

例如,假设您有一个如下所示的简单类:

public class Message
{
    public string MyText { get; set; }
}

然后创建它们的列表(在您的情况下,您将在运行时填充列表):

Messages = new List<Message>
{
    new Message { MyText = "SomeText1" },
    new Message { MyText = "SomeText2" },
    new Message { MyText = "SomeText3" },
};

您可以使用以下 xaml 显示它们:

<ItemsControl ItemsSource="{Binding Messages}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding MyText}"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

DataTemplate 中,您可以添加用于显示类型属性并绑定到它们的控件。

注意事项

请注意,上面的示例只是简单的实现,只是为了展示如何开始。一旦您变得更高级,您可能需要为您的属性(即INotifyPropertyChanged)以及为您的收藏添加/删除项目等实现更改通知。

【讨论】:

  • 谢谢杰西,真的很有帮助。您是否有任何建议的教程或材料可以在互联网上找到以更好地了解 ItemsControl 的使用?
  • @GiovanniNieddu:comment 中给出的 Microsoft 文档链接可能是最好的。有关所有控件的基本信息,我也推荐this tutorial
猜你喜欢
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
  • 2011-01-06
  • 1970-01-01
  • 2018-11-27
  • 2014-10-26
  • 2020-06-18
相关资源
最近更新 更多