在已经在Window ---- WPF中声明的DataContext时绑定DataGrid

时间:2016-06-04 19:44:07

标签: wpf xaml data-binding

我遇到了一个我无法解决的问题,虽然我已经看了几个类似的帖子,但我找不到任何可以解释我情况的内容。

基本上我有一个WPF窗口:

<Window x:Class="NewGame">
    <DataContext="{Binding RelativeSource={RelativeSource Self}}"/>

在类中,我实现了INotifyPropertyChanged,以利用我设置为使用XAML动态更新的某些属性的绑定。例如,我有一个DB,它为团队列出了主要,次要和修剪颜色(十六进制代码),并且属性会根据更改团队自动更新。所以我在XAML中使用以下各种方法自动更新BorderBrush,Foreground和Backgrounds:

<Foreground="{Binding Path=MyPrimColor}">
<Background={Binding Path=MySecColor}">
<BorderBrush={Binding Path=MyTrimColor}">

等...每个都可以是任何属性,无关紧要,这些都可以正常工作。

现在,我有一个DataGrid,我需要绑定到DataTable来显示团队中的玩家,这就是我遇到问题的地方。它告诉我在使用Itemsource&#34;之前,&#34; Items Collection必须是空的。并引发异常。在我开始在XAML中使用数据绑定之前,这一直不是问题,当我在代码中设置了一些东西,一切正常时,但我也知道这不是事情应该完成的方式,这就是为什么我希望让它与XAML数据绑定一起使用。

我创建了MyDT属性作为DataTable,当我尝试绑定时 <DataGrid DataContext="{Binding Path=MyDT}">,它会导致Foreground和Background绑定路径尝试绑定到Data.DataTable对象,这显然会引发错误。

我看到有人说我需要在<DataGrid.DataContext>内使用<datagrid>,但我还没有得到这个。我理解问题的来源---我已经将绑定设置在更高的级别,但我只是不知道如何通过仅将DataGrid绑定到DT属性而在其他方面将其固定在XAML中绑定到类级别。

以下是XAML中的完整代码部分:

<DataGrid x:Name="TeamRosterDT"
 Height="400"
 HorizontalContentAlignment="Center"
 VerticalContentAlignment="Center"
 Foreground="{Binding Path=MyTrimColor}"
 RowBackground="{Binding Path=MySecColor}"
 AlternatingRowBackground="{Binding Path=MyPrimColor}"
 CanUserAddRows="False"
 CanUserDeleteRows="False"
 CanUserResizeColumns="False"
 ColumnWidth="Auto"     
 HorizontalScrollBarVisibility="Visible"
 ItemsSource="{Binding}"
 Opacity="0.8"     
 VerticalScrollBarVisibility="Visible"
 Visibility="Hidden"
 DataContext="{Binding Path=MyDT}">
    <DataGridColumnHeader Style="{StaticResource DataGridHeaderStyle}" />
    <DataGridCell HorizontalContentAlignment="Center" />

</DataGrid>

2 个答案:

答案 0 :(得分:0)

无需更改DataContext(DataContext="{Binding Path=MyDT}"),仅绑定ItemsSource(<DataGrid ItemsSource="{Binding Path=MyDT}"><DataGrid ItemsSource="{Binding Path=MyDT.DefaultView}">

由于不正确的项声明(带有DataGridColumnHeader,DataGridCell的行)而抛出异常。它们被添加到项目列表中,在设置ItemsSource时不支持

答案 1 :(得分:0)

我通过使用:

解决了(我相信)异常
plm

然而,DataTable没有正确更新---当XAML初始化时,它是一个空DB,然后根据选择的团队填充和过滤。选择新团队后,只需过滤DT,而不是重新填充。但是,因为我认为这在技术上并不是一个变化的&#34;对于DT本身,它不会触发OnPropertyChanged事件。如何使用XAML触发器正确更新它,或者是在DB重新过滤时我可以使用的事件?

我会使用ObservableCollection吗?