如何最好地显示此嵌套集合?(你能告诉我为什么我的代码不起作用吗?
本文关键字:告诉我 为什么 我的 不起作用 代码 何最好 显示 集合 嵌套 | 更新日期: 2023-09-27 18:32:42
你能告诉我为什么这段代码不起作用吗?
我有一个视图模型,其中包含搜索结果的可观察集合,该集合具有结果属性的可观察集合。我似乎无法像我想要的那样显示结果属性的嵌套集合。
以下是对象(为便于阅读而抽象(:
class ViewModel
{
public ObservableCollection<SearchResults<TDomain>> SearchResults { get; set; }
}
class SearchResults<TDomain>
{
public TDomain Result { get; set; }
public ObservableCollection<ResultProperty> ResultProperties { get; set; }
}
class ResultProperty
{
public string PropertyValue { get; set; }
}
这是我无法工作的 xaml。DataContext 设置为 ViewModel:
<StackPanel>
<ItemsControl ItemsSource={Binding SearchResults}>
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text={Binding Result.Id}/>
<StackPanel Orientation="Horizontal">
<ItemsControl ItemsSource={Binding ResultProperties}>
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding PropertyValue}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<TextBlock Text="PLACEHOLDER /////"/>
</StackPanel>
我正在寻找的结果是这样的:
[Stack panel to keep things orderly]
1
property1property2property3...
2
property1property2property3...
3
property1property2property3...
PLACEHOLDER /////
我得到的结果是这些
[Stack panel to keep things orderly]
1
2
3
PLACEHOLDER /////
换句话说,绑定不会选取字符串。我已经验证了集合是否按预期填充。但是我无法让 xaml 工作。
**附加信息
好的,所以我尝试了一些解决方案,但它们不起作用,所以我将添加更多详细信息,因为也许我缺少有关集合如何更新的内容。
视图模型上有一个名为"搜索"的按钮,它使用调用视图模型的 TrySearch 方法的 ICommand 方法,如下所示:
public void TrySearch()
{
var results = _model.GetAll();
foreach(var result in results)
this.SearchResults.Add(new SearchResults<TDomain>(result));
}
是否有原因由于集合的更新方式而不起作用?搜索结果是一个依赖属性(我知道我知道,它应该是INPC,但它不是,它的依赖关系(,但其他集合不是。这可能是一个问题吗?
我会将数据模板创建为资源,并在 XAML 中的其他位置引用它们。 例如:
<Window ....>
<Window.Resources>
<DataTemplate x:Key="SearchResultTemplate" TargetType="SearchResults">
<TextBlock Text={Binding PropertyValue}"
</DataTemplate>
<DataTemplate x:Key="ViewModelTemplate" TartgetType="ViewModel">
<StackPanel>
<TextBlock Text={Binding Result.Id}/>
<StackPanel Orientation="Horizontal">
<ItemsControl ItemsSource={Binding ResultProperties} ItemTemplate="{StaticResource SearchResultTemplate}" />
</StackPanel>
</StackPanel
</DataTemplate>
</Window.Resources>
<StackPanel>
<ItemsControl ItemsSource={Binding SearchResults} ItemTemplate="{StaticResource ViewModelTemplate}" />
</Window>
我不确定,但我认为您使用的绑定正在告诉 XAML 解析器查找名为 ResultProperties
和 PropertyValue
的 ViewModel 类的属性。 XAML 分析器看不到它们是绑定到该集合实例的对象的属性。 像这样拆分它应该清楚地表明属性属于要应用模板的实例。
你的代码在某种程度上是正确的,但根据你想要的,它有一个流程。StackPanel 必须是 ItemsPanel。像这样更改它:
<StackPanel>
<ItemsControl ItemsSource="{Binding SearchResults}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Result.Id}"/>
<ItemsControl ItemsSource="{Binding ResultProperties}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" IsItemsHost="True"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding PropertyValue}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<TextBlock Text="PLACEHOLDER /////"/>
</StackPanel>
答案是我的搜索结果类没有正确连接。我把它变成了一个具有依赖属性的依赖对象,它工作正常。我假设如果它是INotifyPropertyChanged,这将进行类似的翻译。感谢您的回复。