【问题标题】:Binding a column header with a Itemsource将列标题与 Itemssource 绑定
【发布时间】:2013-01-21 10:19:03
【问题描述】:

我有一个 Itemsource,我从中绑定数据网格中的值

    <DataGridTextColumn Header="Message" Binding="{Binding Path=message}"/>
    <DataGridTextColumn Header=" Logger" Binding="{Binding Path=logger}"/>
    <DataGridTextColumn Header="Level" Binding="{Binding Path=level}" />

我还必须将标题文本与键字典绑定

    Dictionary<String, object>.KeyCollection keyslist = dict1.Keys;

用这本词典我必须绑定标题文本。

Datagrid 可以有两个 itemsource 吗??

【问题讨论】:

  • 我认为你应该进一步解释你想要什么。 DataGrid 的 ItemsSource 应该是什么,标题的 Itemsource 应该是什么?
  • Datagrid 有一个 IEnumerable 集合(Say Result)作为 Itemsource,当我直接绑定它时说 this.datagrid.Itemsource=Result 它会在提供的数据网格中自动绑定 Autogenerate columns =True 但我需要格式化列标题和列,以便 Autogeneratecolumns =true 不能满足我的需要,现在我在字典“Keyslist”中有一个列标题列表......如何将键列表绑定到列标题?或者我如何从“结果”中获取列标题
  • 那么你的代码有什么用?除了 Header="Level" 等之外,您还需要其他东西吗?
  • 不,我不想像我所做的那样硬编码标题,而是我需要从 Itemsource Keyslist 绑定的标题是从 Result 中提取的标题名称列表,因此代码没有问题,但没有硬编码
  • 我有这种感觉,你最好用代码隐藏来做这种事情,但是张贴了一个 xaml 的做事方式供你探索

标签: wpf datagrid datagridtextcolumn


【解决方案1】:

您的问题的简短回答是:是的,有可能。虽然这是一种混乱的做事方式,我不建议这样做(除非你真的必须这样做,因为我不知道你的上下文详细信息),但我的想法是:

  1. 第一个问题是,标头绑定似乎有些损坏。我无法通过常规方式绑定到它,除非通过 Source={x:Static} 定义备用数据上下文。

  2. 在 Header 绑定中无法绑定到集合,因此您需要给它一个缩放器值或编写一个转换器,该转换器接受一个参数并在您的字典中查找它以返回真实的价值。

下面的示例代码展示了我们是如何测试绑定的(没有转换器):

XAML

<Window x:Name="window" x:Class="WpfDataGridMisc.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="214" DataContext="{Binding Source={x:Static wpfDataGridMisc:PersonsViewModel.Instance}}"
        xmlns:wpfDataGridMisc="clr-namespace:WpfDataGridMisc">
    <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Persons}">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding FirstName}" Header="{Binding Source={x:Static wpfDataGridMisc:PersonsViewModel.Instance}, Path=Header1}" />
        </DataGrid.Columns>
    </DataGrid>
</Window>

PersonsViewModel

using System;
using System.Collections.ObjectModel;

namespace WpfDataGridMisc
{
    public class PersonsViewModel
    {
        private static readonly PersonsViewModel Current = new PersonsViewModel();

        public static PersonsViewModel Instance { get { return Current; } }

        private PersonsViewModel()
        {
            Persons = new ObservableCollection<Person>
                {
                    new Person {FirstName = "Thomas", LastName = "Newman", Date = DateTime.Now},
                    new Person {FirstName = "Dave", LastName = "Smith", Date = DateTime.Now},
                };
            Header1 = "Header 1";
        }

        public ObservableCollection<Person> Persons { get; private set; }

        public string Header1 { get; set; }
    }
}

Person 类是从上面代码中的 Person 推导出的标准 poco。

致谢:感谢Johan Larsson 提供大量代码。他正在研究这个解决方案,我只是在帮忙,但他觉得我应该发布答案,因为 x:Static 是我的想法。

【讨论】:

    猜你喜欢
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    • 2011-07-10
    • 2010-12-21
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多