将列标题与Itemssource绑定

时间:2013-01-21 10:19:03

标签: wpf datagrid datagridtextcolumn

我有一个Itemsource,我从中绑定datagrid中的值

    <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?

1 个答案:

答案 0 :(得分:0)

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

  1. 第一个问题是,标题绑定似乎有所破坏。我无法通过常规方法绑定它,除非通过Source = {x:Static}来定义备用datacontext。

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

  3. 这里的示例代码显示我们如何测试绑定(没有转换器):

    <强> 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 class是上面代码中Person的标准poco。

    信用:感谢Johan Larsson代码的大部分内容。他正在研究这个解决方案,我只是在帮助,但他觉得我应该将答案发布为x:静态是我的想法。