该应用程序使用显示行的 DataGrid。任务是确保选定的 SelectedItem 行以颜色显示,无论 DataGrid 当前是否可用。同时,该应用程序有一个夜间主题,其中颜色应该不同。我创建了一个 ColorThemeManager 类来存储两个主题的颜色。在主代码中绑定工作正常
<Window Background="{Binding ColorThemeManager.MainBackGroundColor}">
但对于 DataGrid,绑定不起作用:
<DataGrid ItemsSource="{Binding CurrentTestDevice.TestsSpecifications}">
<DataGrid.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="{Binding ColorThemeManager.SelectedRowColor"/>
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="{Binding DataContext.ColorThemeManager.SelectedRowColor, RelativeSource={RelativeSource AncestorType=Window}}"/>
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="{Binding DataContext.ColorThemeManager.SelectedRowForegroundColor, RelativeSource={RelativeSource AncestorType=Window}}"/>
<SolidColorBrush x:Key="{x:Static SystemColors.GrayTextBrushKey}" Color="Red"/>
</DataGrid.Resources>
...
</DataGrid>
我尝试了不同的方式。只有显式指定颜色的选项(如最后一个选项)才有效。这种情况下如何正确进行Binding呢?或者是否有另一种方法来设置所选行及其文本的颜色?
一般来说,使用图层
ViewModel来存储夜间和白天主题的特定颜色并不是一个好主意。颜色仍然是图层的责任View。我们可以为白天和夜晚的主题设置不同的风格:ViewModel将仅包含一个标志,IsDark该标志将明确选择哪种样式,我们将使用触发器选择样式:好吧,让我们将这三种样式放置在单独的样式字典中并将其连接到窗口,或者放置在窗口资源中: