我是 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/