gpt4 book ai didi

来自对象列表列表的 C# ListBox(以及更深层次的)

转载 作者:太空宇宙 更新时间:2023-11-03 22:18:31 27 4
gpt4 key购买 nike

考虑一个书架,它有书架,每个书架上都有许多书。反过来,每本书都有一些属性,例如标题和作者,也许还有 ISBN。

namespace mySillyExample
{
public class BookShelf
{
public Shelf[] myShelves{get; set;}
}

public class Shelf
{
public Book[] booksOnThisShelf{get; set;}
}

public class Book
{
public string Title {get; set;};
public string Author{get; set;};
public string ISBN {get; set;};
}
}

现在我想使用 WPF 在 XAML 中创建一个列表框以列出所有标题。现在我的解决方案看起来像这样:

<ListBox Height="154" HorizontalAlignment="Left" 
ItemsSource="{Binding Path=BookShelf.myShelves}"
Margin="171,475,0,0" VerticalAlignment="Top" Width="333" >
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=booksOnThisShelf.[0].Title}" />
</DataTemplate>
<ListBox.ItemTemplate>
</ListBox>

我确实得到了一个包含该数据的列表框。我发现上述解决方案存在三个问题。

  1. DataTemplate 标记似乎旨在更改列表框将包含的控件类型,而不是在使用时提供额外的绑定(bind)范围

  2. 我似乎引用了每个书架的书籍数组中的第 0 个(第零个/第一个)元素(“booksOnThisShelf.[0]”),这似乎是最邪恶的,因为它似乎不是什么如果我确实得到了我所有书籍的 list (我这样做),就会发生这种情况

  3. 这似乎适用于 2 层列表,但是 3、4 或 42 层呢?

请记住,我不能直接更改类(它们是在 XSD 中生成的),尽管辅助类的潜力不一定是不可能的。

我对这个问题的思考越多,我就越相信它一定会出现在更多人身上,尤其是在处理来自复杂 XML 结构的数据时(网页?给我所有 img 标签等的 url)

总而言之,这就是我要找的东西:

  1. 处理上述问题的最佳方法是什么?
    • 最好在 XAML 中维护的最优雅/可重用模型
  2. 如何将其抽象为 n 层列表(对象包含对象列表,对象列表包含对象列表……无穷无尽/恶心)?
    • 使用我的示例,如果您有一个包含多个 BookShelves 的 Room 类、一个包含多个 Rooms 的 Library 类和一个包含多个 Libraries 的 City 类会怎样?

一如既往地提前致谢!

注意:我使用了术语“列表”并且代码显示了一个数组,对于混淆我深表歉意

最佳答案

我建议查看 MVVM 模式。你不绑定(bind)到你的模型,但你绑定(bind)到你的 ViewModels。你是 ViewModel,它将帮助你获得巨大的列表。你可能想做这样的事情:

//ViewModelBase should be a base class that implements INotifyPropertyChanged
public class MyViewModel : ViewModelBase
{
public readonly IDataProvider _provider;

public MyViewModel(IDataProvider provider)
{
_provider = provider ?? (some default provider);
}

public IList<String> Titles
{
get
{
var q = from shelves in _provider.GetBookShelves()
from books in shelves.booksOnThisShelf
select books.Title;

return q as List<String>;
}
}
}

然后您只需将 MyViewModel 设置为您的 DataContext 并绑定(bind)到 Titles。当然,您不必传入 IDataProvider,您可以传入 BookShelves 列表,但最好让 DataProvider 为您获取模型信息。

关于来自对象列表列表的 C# ListBox(以及更深层次的),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4097364/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com