当已经在窗口中声明了DataContext时绑定DataGrid----WPF



我遇到了一个无法解决的问题,尽管我看过一些类似的帖子,但我没有找到任何可以解释我的情况的东西。

基本上我有一个WPF窗口:

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

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

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

,等等…每个都可以是任何属性,没关系,这些都很好。

现在,我有一个DataGrid,我需要将其绑定到DataTable以显示团队中的玩家,这就是我遇到问题的地方。它告诉我"在使用Itemsource之前,项目集合必须为空",并抛出异常。在我开始在XAML中使用数据绑定之前,这从来都不是一个问题,当我在代码后面设置了东西时,一切都很好,但我也知道这不是应该做的事情,这就是为什么我想让它与XAML数据绑定一起工作。

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

我看到一些人说我需要在<datagrid>中使用<DataGrid.DataContext>,但我也没有做到这一点。我知道问题的根源——我已经在更高级别上设置了绑定,但我不知道如何在XAML中修复它,只将DataGrid绑定到DT属性,而将其他绑定到类级别。

以下是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>

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

由于项声明不正确(具有DataGridColumnHeader、DataGridCell的行)而引发异常。它们被添加到ItemsSource设置为时不支持的Items列表中

我通过使用解决了异常(我相信)

<DataGrid.ColumnHeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="Background" Value="{Binding Path=MyPrimColor}" />
<Setter Property="Foreground" Value="{Binding Path=MyTrimColor}" />
<Setter Property="HorizontalContentAlignment" Value="Center" />
</Style>
<DataGrid.ColumnHeaderStyle>
<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="HorizontalContentAlignment" Value="Center" />
</Style>
</DataGrid.CellStyle>

然而,DataTable没有正确更新——当XAML初始化时,它是一个空的DB,然后根据选择的团队填充和筛选。当选择一个新团队时,DT只是被过滤,而不是重新填充。然而,由于我认为这在技术上不是对DT本身的"更改",因此它不会触发OnPropertyChanged事件。我如何使用XAML触发器使其正确更新,或者这不是我在DB重新筛选时可以利用的事件?

我会在哪里使用ObservableCollection?

最新更新