gpt4 book ai didi

c# - WPF,TreeView,绑定(bind)到集合中对象内的属性

转载 作者:行者123 更新时间:2023-12-03 10:35:07 26 4
gpt4 key购买 nike

这可能并不难,但我越来越困惑。

我想在我的 View 中显示一个 TreeView,但我无法正确进行数据绑定(bind)。

TemplateFamilyList 集合是根对象。它将包含 TemplateFamily 对象的列表。这些 TemplateFamily 对象中的每一个都将包含一个 Template 对象和一个 TemplateParameter 对象列表,称为 TemplateParameterMembers。实际的 Template 类和实际的 TemplateParameter 类都具有 Name 属性以及其他属性。

所以,在我的 ViewModel 类中,我有这个填充集合的方法:

 public void LoadTemplateTree()
{
TemplateFamilyList = new ObservableCollection<TemplateFamily>();

List<Template> templateList = BuilderService.GetAllTemplates();
List<TemplateParameter> templatesParametersList;

foreach (Template template in templateList)
{
templatesParametersList = BuilderService.GetATemplatesParameters(template.TemplateID);
TemplateFamilyList.Add(new TemplateFamily(template, new ObservableCollection<TemplateParameter>(templatesParametersList)));
}
}

这是 TemplateFamily 类:
 public class TemplateFamily
{
public Template Template { get; set; }

public ObservableCollection<TemplateParameter> TemplateParameterMembers { get; set; }

public TemplateFamily(Template aTemplate, ObservableCollection<TemplateParameter> templatesParameters)
{
Template = aTemplate;
TemplateParameterMembers = templatesParameters;
}
}

我想要的是一个 TreeView,例如:
  • NameOfTemplateA
  • NameOfTemplateB
  • NameOfTemplateParameterB1
  • NameOfTemplateParameterB2

  • 等等

    在我的 XAML 中,我有这个:(但它不起作用,它提供了一些只有箭头但没有名称的空白 TreeView )。
    <TabItem Header="Template Files" Height="22" VerticalAlignment="Top">
    <TreeView Height="Auto" Name="treeView1" Width="Auto" ItemsSource="{Binding TemplateFamilyList}">
    <TreeView.ItemTemplate>
    <HierarchicalDataTemplate ItemsSource="{Binding TemplateParameterMembers}" >
    <TextBlock Text="{Binding Path=Name}" Margin="2" ></TextBlock>
    </HierarchicalDataTemplate >
    </TreeView.ItemTemplate>
    </TreeView>
    </TabItem>

    ViewModel 使用 ViewModelLocator 绑定(bind)到 View,在其他情况下也可以正常工作。我知道如果我绑定(bind)到 TemplateFamilyList,它将获得正确的对象,我只是不知道如何显示该列表中每个 TemplateFamily 的名称(应该是 TemplateFamily 对象的 Template 属性的 Name 属性)和那么对于树中的下一层,如果有 TemplateParameterMembers 列表,如何显示 TemplateParameterMembers 集合中每个项目的 TemplateParameter 属性的 Name 属性。

    我想我可以尝试在 TemplateFamily 类中使​​用另一个属性 Name,并在构造函数中简单地复制 Template 的 Name 属性,例如:
    public TemplateFamily(Template aTemplate, ObservableCollection<TemplateParameter> templatesParameters)
    {
    Template = aTemplate;
    Name = aTemplate.Name;
    TemplateParameterMembers = templatesParameters;
    }

    但我不喜欢这种方法,此外,我没有用于 TemplateParameters 集合的特殊“容器”类,所以我仍然需要以某种方式向下钻取并获取每个项目中 TemplateParameter 的 Name 属性TemplateParameterMembers 集合。

    我看到了 post
    似乎在答案中,Gishu 使用了 DataType 属性,例如:
    DataType="{x:Type local:Group}

    在 OP 帖子中定义的本地命名空间为:
    xmlns:local="clr-namespace:TaskManager.Domain;assembly=TaskManager.Domain"

    但是,就我而言,Template 和 TemplateParameter 类是我模型的一部分,它们甚至与 ViewModel 和 View 不在同一个项目中。
    就我的本地命名空间而言,我有这个:
    xmlns:local="clr-namespace:S.VisualStudioExtension"           
    local:ViewModelLocator.AutoWireViewModel="True"

    然后我应该为 Template 和 TemplateParameter 类添加一个命名空间,例如:
    xmlns:domain="clr-namespace:S.ModelDomain" 

    并尝试在 DataType 属性中使用它?

    我还怀疑我的 XAML 有问题,也许我应该有另一个分层数据模板?

    最佳答案

    在这种情况下,最好和最通用的(在我看来)解决方案是为将在树中呈现的每种类型的项目定义一个模板,并将它们放入树的资源字典中。每个模板都应该使用 DataType 与相应的项目类型相关联。属性(property)。这样,将自动选择合适的模板来根据其类型呈现每个项目。假设您的 TemplateParameter类在一个名为 S.ModelDomain 的项目中定义在命名空间 S.ModelDomainlocal前缀在您的 XAML 中正确定义,这应该会给您预期的结果(我冒昧地剥离了您的 XAML 的不相关属性):

    <TreeView xmlns:models="clr-namespace:S.ModelDomain;assembly=S.ModelDomain"
    ItemsSource="{Binding TemplateFamilyList}">
    <TreeView.Resources>
    <HierarchicalDataTemplate DataType="{x:Type local:TemplateFamily}"
    ItemsSource="{Binding TemplateParameterMembers}" >
    <TextBlock Text="{Binding Template.Name}" />
    </HierarchicalDataTemplate>
    <DataTemplate DataType="{x:Type models:TemplateParameter}">
    <TextBlock Text="{Binding Name}" />
    </DataTemplate>
    </TreeView.Resources>
    </TreeView>

    尽管在 XAML 的根元素(通常是 WindowUserControl)上定义命名空间映射是常见的做法。在此处查看更多信息: XAML Namespaces and Namespace Mapping for WPF XAML .

    请注意,模板没有 x:Key尽管已放入资源字典中,但仍指定了参数。在自动模板选择过程中需要考虑模板。这种模板称为隐式模板。这是一个有用的链接: Data Templating Overview .

    关于c# - WPF,TreeView,绑定(bind)到集合中对象内的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34556479/

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