【问题标题】:C# TreeView and binding to a databaseC# TreeView 和绑定到数据库
【发布时间】:2014-02-24 19:45:24
【问题描述】:

我正在通过存储过程查询数据库并取回数据。我正在将其填充到这样的对象中:

private GetMiscVars _batchVariablesData;
        public GetMiscVars BatchVariablesData
        {
            get { return _batchVariablesData; }
            set
            {
                if (_batchVariablesData == value) return;
                _batchVariablesData = value;
                OnPropertyChanged("BatchVariablesData");
            }
        }  

在我的 XAML 中我有这个:

<TreeView>
    <TreeViewItem Header="Batch Data" ItemsSource="{Binding BatchVariablesData}">
            <TreeViewItem.HeaderTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding VarDesc}" />
                </DataTemplate>
        </TreeViewItem.HeaderTemplate>
    </TreeViewItem>
</TreeView>  

当我的代码运行时,我看到的是我的父节点是空白的,而不是像我希望的那样说“批处理数据”,并且我的子节点在此 DgTabData 中返回调用数据库时使用的 ObservableCollection 的名称。
那么,我在哪里搞砸了?
谢谢

为了澄清一点,我有一个存储过程,它返回如下所示的数据:

VarId   EventId VarDesc
11      2489    WP1.WC01 Quantity
1196    2489    WP1.WC01 Brew Number
1197    2489    WP1.WC01 Operator Name
1216    2489    WP1.WC01 Integer Test
1217    2489    WP1.WC01 Logical Test
1218    2489    WP1.WC01 Float-4 Test
1219    2489    WP1.WC01 Float-3 Test  

我想获取 VarDesc 字段并将其放在 TreeView 中的 Batch Data 标题下。一旦我弄清楚这一点,我希望能够从 TreeView 中选择的项目中获取 VarId 和 EventId 值,因为我将使用它们来填充数据网格。

【问题讨论】:

  • GetMiscVars 是如何声明的?
  • 是一个访问数据库的类。我通过 BatchVariablesData.GetData(myParameters) 获取数据,它正在发生并返回数据。

标签: c# wpf treeview


【解决方案1】:

首先,TreeView 显示分层数据。这意味着您的数据必须具有 public 集合属性才能用于子节点。接下来,要显示分层数据,您需要声明一个HierarchicalDataTemplate,而不是像您一样尝试定义控件。试试这个 XAML:

<TreeView ItemsSource="{Binding CollectionOfParents}">
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type YourPrefix.YourClassName}" 
            ItemsSource="{Binding CollectionOfChildrenPropertyInParent}">
            <TextBlock Text="{Binding PropertyInParent}" /><!-- Parent DataTemplate -->
            <HierarchicalDataTemplate.ItemTemplate>
                <DataTemplate> <!-- Child DataTemplate -->
                    <TextBlock Text="{Binding PropertyInChild}" />
                </DataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>

更新>>>

正如我所说,TreeView 显示分层数据。这意味着您的数据必须具有公共集合属性才能用于子节点。因此,创建一个类,假设命名为Data,具有一个属性来保存Batch Data 文本,假设命名为Name,以及一个ObservableCollection&lt;string&gt; 属性,假设命名为Items 来保存VarDesc 列价值观。

然后,您需要以您认为合适的任何方式使用从存储过程返回的项目填充集合。最后,创建一个ObservableCollection&lt;Data&gt; 属性,假设在代码后面或视图模型中命名为DataItems,并添加您的Data 类,并包含集合项。然后你可以像这样绑定到TreeView

<TreeView ItemsSource="{Binding DataItems}">
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type YourXamlNamespacePrefix.Data}" 
            ItemsSource="{Binding Items}">
            <TextBlock Text="{Binding Name}" /> <!-- Parent DataTemplate -->
            <HierarchicalDataTemplate.ItemTemplate>
                <DataTemplate> <!-- Child DataTemplate -->
                    <TextBlock Text="{Binding}" />
                </DataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>

【讨论】:

  • 所以我不能采用由我用于数据网格的存储过程填充的 ItemsSource 并将其用于 TreeView(这就是我基本上想要的做)?我只想从此 ItemsSource 中获取一个字段并将其显示在具有固定标签的 TreeView 中。那么一旦他们在 TreeView 中选择了一个项目,我将填充另一个网格,但首先要做的事情......
  • 最好的办法是创建具有显示和/或编辑所需属性的类,并用它们填充ObservableCollection&lt;T&gt;,以便在 UI 中显示。
  • 当我在 TreeView.Resources 下尝试这一切时,会抛出一个错误,提示“资源从未使用过”
  • 已经用你的实际 XAML命名空间前缀替换了YourXamlNamespacePrefix,不是吗?
  • 是的,但是名字有误。这是该死的接近。我现在有 Batch Data 的父节点,它在它下面显示 VarDesc,但是每个 VarDesc 都有自己的 Batch Data 节点。因此,我有 7 个批处理数据,每个批处理数据都有自己的 VarDesc,而不是一个带有 7 个 VarDesc 的批处理数据。我认为问题出在您所说的 DataItems 中,我现在正在研究更多。
猜你喜欢
  • 2011-07-08
  • 1970-01-01
  • 2019-05-10
  • 1970-01-01
  • 2012-12-10
  • 1970-01-01
  • 2017-07-09
  • 2011-12-18
  • 1970-01-01
相关资源
最近更新 更多