wpf - 如何将控件绑定(bind)到 WPF ListView 列

标签 wpf listview binding

我是 WPF 的新手,如果我遗漏了一些明显的东西,请原谅我

我有以下 ListView 控件(为简洁起见删除了不相关的细节)

<ListView>
  <ListView.View>
    <GridView>
      <GridViewColumn Header="Type" DisplayMemberBinding="{Binding Type}"/>
      <GridViewColumn Header="Details" DisplayMemberBinding="{Binding Details}"/>
    </GridView>
  </ListView.View>
</ListView>

我在后面的代码中将项目添加到此 ListView

public void Add(LogEntry entry)
{
  ListViewItem item = new ListViewItem();
  item.Content = entry;
  listView.Items.Add(item);
}

其中 LogEntry 具有“Type”和“Details”的公共(public)字符串属性

到目前为止,还不错,一切都很好,但是.. 我希望我的 details 属性本身就是一个元素(包含各种类型内容的 TextBox 或 DockPanel) 如何将此元素绑定(bind)到列表列?

使用上面的代码,将“详细信息”更改为一个元素,我只是在列表框中获取类名(例如 System.Windows.Control.TextBox),因为默认情况下单元格显示属性的 ToString() 值。 我用谷歌搜索了使用 DataTemplate 的示例,但找不到将元素绑定(bind)到面板内容的示例。 控件不能在 xaml 中定义,因为它的结构和内容直到运行时才知道

绑定(bind)是一种方式(我只需要显示列表,不更新底层数据结构)

为了让我的问题更清楚,我想绑定(bind)下面的列表项

class LogEntry
{
  public string Type {get;}
  public DockPanel Details {get;} // This dock panel was created by code and contains
                                  // various elements not predictable at compile time
}

最佳答案

您的模型(LogEntry 类)不应引用 UI 控件。相反,它应该包含 UI 所需的数据,并且 XAML 应该定义一个使用该数据的 DataTemplate。例如,

public class LogEntry
{
  public string Type {get;}
  public ObservableCollection<IDetail> Details {get;}
}

<DataGridTemplateColumn Header="Details">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <DockPanel>
                <ItemsControl ItemsSource="{Binding Details}" />
            </DockPanel>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

您提到 LogEntry 中的 DockPanel 创建了运行时未知的项。你能举个例子吗?在大多数情况下,您应该在数据中具有某种模式,您可以使用 DataTemplates 来定义如何绘制每个 Detail block 。

<DataTemplate DataType="{x:Type local:LoginDetail}}">
    <StackPanel Orientation="Horizontal">
        <TextBlock Text="{Binding CreatedDate}" />
        <TextBlock Text="{Binding UserName}" />
        <TextBlock Text="{Binding MachineLoggedIn}" />
    </StackPanel>
</DataTemplate>

<DataTemplate DataType="{x:Type local:LogoutDetail}}">
    <StackPanel Orientation="Horizontal">
        <TextBlock Text="{Binding CreatedDate}" />
        <TextBlock Text="{Binding UserName}" />
        <TextBlock Text="{Binding LoggedInTime}" />
    </StackPanel>
</DataTemplate>

如果你真的需要在模型中存储一个控件​​,那么你可以在你的 DataGridTemplateColumn 中使用一个 ContentControl 并将它的 Content 设置为相等到细节

<ContentControl Content="{Binding Details}" />

关于wpf - 如何将控件绑定(bind)到 WPF ListView 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7684903/

相关文章:

c# - Telerik RadWindow

WPF 最有效的图片加载方式

c# - .NET ListView 行填充

使用 setInterval 调用的 Javascript 绑定(bind)

c# - 将可观察集合绑定(bind)到 XAML 中的 ListBox

c# - 数据绑定(bind) Entity Framework 导航属性 - 处理更改

c# - 仅为一列创建 DataGrid 工具提示(每行不同的工具提示)

java - Android,ObjectAnimator 滞后于两个重叠的布局

java - 我的 EditFriendsActivity 中没有出现 ActionBar。我的代码有什么问题?

c# - 从两个不同的 View 绑定(bind)到数据源。 MVVM、WPF