如何最好地显示此嵌套集合?(你能告诉我为什么我的代码不起作用吗?

本文关键字:告诉我 为什么 我的 不起作用 代码 何最好 显示 集合 嵌套 | 更新日期: 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 解析器查找名为 ResultPropertiesPropertyValue 的 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,这将进行类似的翻译。感谢您的回复。

相关文章: