WPF DataGrid绑定了2个不同的集合

时间:2014-03-23 05:19:05

标签: wpf xaml wpfdatagrid

是否可以对DataGrid使用2个不同的集合?

收集天数 - 数据网格行, 集合标题 - 数据网格标题。

视图模型:

public class MonthViewModel : ViewModel
{
    public ObservableCollection<DayViewModel> Days { get; set; }
    public ObservableCollection<string> Headers { get; set; }

    public MonthViewModel()
    {
        Days = new ObservableCollection<DayViewModel>
        {
            new DayViewModel { Value1 = 1, Value2 = 2 },
            new DayViewModel { Value1 = 3, Value2 = 4 },
        };

        Headers = new ObservableCollection<string>
        {
            "Header1",
            "Header2"
        };
    }
}

public class DayViewModel : ViewModel
{
    private int _value1;
    public int Value1
    {
        get
        {
            return _value1;
        }
        set
        {
            _value1 = value;
            OnPropertyChanged();
        }
    }

    private int _value2;
    public int Value2
    {
        get
        {
            return _value2;
        }
        set
        {
            _value2 = value;
            OnPropertyChanged();
        }
    }
}

查看:

<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Days}">

    <DataGrid.Columns>
        <DataGridTextColumn Header="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext.Headers[0]}" Binding="{Binding Value1}"/>
        <DataGridTextColumn Header="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext.Headers[1]}" Binding="{Binding Value2}"/>
    </DataGrid.Columns>

</DataGrid>

错误 - 找不到引用'RelativeSource FindAncestor,AncestorType ='System.Windows.Controls.DataGrid',AncestorLevel ='1'的绑定源。 BindingExpression:路径= DataContext.Headers [0];的DataItem = NULL; target元素是'DataGridTextColumn'(HashCode = 7245576); target属性是'Header'(类型'Object')

有什么问题?

1 个答案:

答案 0 :(得分:1)

问题是你的RelativeSource绑定最终会在DataGrid的数据上下文中查找名为“Headers”的属性(由ItemsSource设置,因此是DayViewModel的集合,显然不是{{{ 1}}属性。

最小的变化是查看Window的DataContext而不是DataGrid。

Headers

鉴于XAML的声明性质,以及您的标题可能不应该在运行时更改的事实,我会重新考虑绑定“Header”文本,但上述解决方案应该可以解决您的问题。