【问题标题】:How to create ListBoxItem within behind code如何在后面的代码中创建 ListBoxItem
【发布时间】:2010-08-18 09:32:12
【问题描述】:

由于某种原因,我必须在后面的代码中初始化 ListBox 项,原因太复杂了。

在 WPF UserControl 出现期间调用 LoadFamily()。

public void LoadFamily()
{
    DataTemplate listItemTemplate = this.FindResource("ManDataTemplate") as DataTemplate;

    foreach (Person man in family)
    {
        ListBoxItem item = new ListBoxItem();

        item.DataContext = man;
        item.ContentTemplate = listItemTemplate;
        // other initialize for item object
        this.ActivityList.Items.Add(item);
    }
}

在我的 xmal 文件中,我定义了一个 DataTemplate。

<DataTemplate x:Key="ManDataTemplate" DataType="{x:Type local:Person}">
    <TextBlock Text="{Binding Path=Name}"/>
</DataTemplate>

但 ListBox 只包含空文本块,人名不显示。不知道为什么,可能是数据绑定错了,后面的代码怎么弄。

感谢您的帮助! (WPF 3.5 或 4.0)

//////////////////////////////////// ///////////////

感谢您的所有帮助。我发现我错了。 我不应该将ListBoxItem添加到ActivityList.Items中,一个是UIElement,另一个是>DataCollection。它们是两个不同的东西。

我应该修改代码如下:

foreach (Person man in family)
{
    this.ActivityList.Items.Add(man);
    ListBoxItem item = this.ActivityList.ItemContainerGenerator.ContainerFromItem(man) as ListBoxItem;
    item.ContentTemplate = listItemTemplate;
    // other initialize for item object
}

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    我没有看到手动创建列表框项的好处。只需将 Listbox 的 ItemsSource 设置为人员(家庭)列表即可。

    【讨论】:

    • 好处隐藏在 // other initialize for item object 中,我将其注释掉。里面的代码太多了。 :(
    • 我仍然认为最好将 ListBox 的 ItemsSource 设置为列表,然后只使用 XAML 中的数据模板。然后它将自动为每个 Item 使用正确的 DataContext 并读取 Name 属性
    • 我按你说的试了,花了我一些时间。我必须将大量代码转换为 xmal,这对其他人来说太难理解了。
    【解决方案2】:

    可能存在绑定错误。这就是文本块为空的原因。查看VisualStudio的Output窗口,如果存在绑定错误会显示。

    HTH

    【讨论】:

    • 在仔细检查输出后,我发现我错了。我已经更新了我的问题。谢谢。
    猜你喜欢
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    相关资源
    最近更新 更多